diff options
Diffstat (limited to 'src/encoding')
| -rw-r--r-- | src/encoding/xml/xml.go | 5 | ||||
| -rw-r--r-- | src/encoding/xml/xml_test.go | 35 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index 50a91a897f..d4509dfc85 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -314,15 +314,14 @@ func (d *Decoder) Token() (Token, error) { } } + d.pushElement(t1.Name) d.translate(&t1.Name, true) for i := range t1.Attr { d.translate(&t1.Attr[i].Name, false) } - d.pushElement(t1.Name) t = t1 case EndElement: - d.translate(&t1.Name, true) if !d.popElement(&t1) { return nil, d.err } @@ -495,6 +494,8 @@ func (d *Decoder) popElement(t *EndElement) bool { return false } + d.translate(&t.Name, true) + // Pop stack until a Start or EOF is on the top, undoing the // translations that were associated with the element we just closed. for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go index 15c5a7492f..e20dc781a1 100644 --- a/src/encoding/xml/xml_test.go +++ b/src/encoding/xml/xml_test.go @@ -1059,6 +1059,41 @@ func TestIssue12417(t *testing.T) { } } +func TestIssue20685(t *testing.T) { + testCases := []struct { + s string + ok bool + }{ + {`<x:book xmlns:x="abcd" xmlns:y="abcd"><unclosetag>one</x:book>`, false}, + {`<x:book xmlns:x="abcd" xmlns:y="abcd">one</x:book>`, true}, + {`<x:book xmlns:x="abcd" xmlns:y="abcd">one</y:book>`, false}, + {`<x:book xmlns:y="abcd" xmlns:x="abcd">one</y:book>`, false}, + {`<x:book xmlns:x="abcd">one</y:book>`, false}, + {`<x:book>one</y:book>`, false}, + {`<xbook>one</ybook>`, false}, + } + for _, tc := range testCases { + d := NewDecoder(strings.NewReader(tc.s)) + var err error + for { + _, err = d.Token() + if err != nil { + if err == io.EOF { + err = nil + } + break + } + } + if err != nil && tc.ok { + t.Errorf("%q: Closing tag with namespace : expected no error, got %s", tc.s, err) + continue + } + if err == nil && !tc.ok { + t.Errorf("%q: Closing tag with namespace : expected error, got nil", tc.s) + } + } +} + func tokenMap(mapping func(t Token) Token) func(TokenReader) TokenReader { return func(src TokenReader) TokenReader { return mapper{ |
