Skip to content

Commit bf21643

Browse files
rstonigeltao
authored andcommitted
encoding/xml: Return SyntaxError for unmatched root start elements.
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 <[email protected]>
1 parent da7e9e4 commit bf21643

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/encoding/xml/xml.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ func (d *Decoder) Token() (t Token, err error) {
245245
t = d.nextToken
246246
d.nextToken = nil
247247
} else if t, err = d.rawToken(); err != nil {
248+
if err == io.EOF && d.stk != nil && d.stk.kind != stkEOF {
249+
err = d.syntaxError("unexpected EOF")
250+
}
248251
return
249252
}
250253

src/encoding/xml/xml_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,3 +750,24 @@ func TestIssue5880(t *testing.T) {
750750
t.Errorf("Marshal generated invalid UTF-8: %x", data)
751751
}
752752
}
753+
754+
func TestIssue11405(t *testing.T) {
755+
testCases := []string{
756+
"<root>",
757+
"<root><foo>",
758+
"<root><foo></foo>",
759+
}
760+
for _, tc := range testCases {
761+
d := NewDecoder(strings.NewReader(tc))
762+
var err error
763+
for {
764+
_, err = d.Token()
765+
if err != nil {
766+
break
767+
}
768+
}
769+
if _, ok := err.(*SyntaxError); !ok {
770+
t.Errorf("%s: Token: Got error %v, want SyntaxError", tc, err)
771+
}
772+
}
773+
}

0 commit comments

Comments
 (0)