]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: Return SyntaxError for unmatched root start elements.
authorRobert Stepanek <robert.stepanek@gmail.com>
Sat, 5 Sep 2015 14:06:43 +0000 (16:06 +0200)
committerNigel Tao <nigeltao@golang.org>
Thu, 10 Sep 2015 01:18:30 +0000 (01:18 +0000)
Currently, the xml.Decoder's Token routine returns successfully for
XML input that does not properly close root start elements (and any
unclosed descendants). For example, all the following inputs

    <root>
    <root><foo>
    <root><foo></foo>

cause Token to return with nil and io.EOF, indicating a successful
parse.

This change fixes that. It leaves the semantics of RawToken intact.

Fixes #11405

Change-Id: I6f1328c410cf41e17de0a93cf357a69f12c2a9f7
Reviewed-on: https://go-review.googlesource.com/14315
Reviewed-by: Nigel Tao <nigeltao@golang.org>
src/encoding/xml/xml.go
src/encoding/xml/xml_test.go

index 0a21c9305310341812f95d48bdd55fdc4f117fdd..6c7debe521051cf1b80d531e543030662cb2f95c 100644 (file)
@@ -245,6 +245,9 @@ func (d *Decoder) Token() (t Token, err error) {
                t = d.nextToken
                d.nextToken = nil
        } else if t, err = d.rawToken(); err != nil {
+               if err == io.EOF && d.stk != nil && d.stk.kind != stkEOF {
+                       err = d.syntaxError("unexpected EOF")
+               }
                return
        }
 
index 312a7c98a5c50488fda5a98bed217598b6300eb0..19465d7fb1744aa4d710e2d0971d4b0beeb8d74f 100644 (file)
@@ -750,3 +750,24 @@ func TestIssue5880(t *testing.T) {
                t.Errorf("Marshal generated invalid UTF-8: %x", data)
        }
 }
+
+func TestIssue11405(t *testing.T) {
+       testCases := []string{
+               "<root>",
+               "<root><foo>",
+               "<root><foo></foo>",
+       }
+       for _, tc := range testCases {
+               d := NewDecoder(strings.NewReader(tc))
+               var err error
+               for {
+                       _, err = d.Token()
+                       if err != nil {
+                               break
+                       }
+               }
+               if _, ok := err.(*SyntaxError); !ok {
+                       t.Errorf("%s: Token: Got error %v, want SyntaxError", tc, err)
+               }
+       }
+}