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{