diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index 50a91a897fb195..d4509dfc851f55 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 15c5a7492fa084..e20dc781a1273b 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 + }{ + {`one`, false}, + {`one`, true}, + {`one`, false}, + {`one`, false}, + {`one`, false}, + {`one`, false}, + {`one`, 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{