aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/xml
diff options
context:
space:
mode:
authorConstantin Konstantinidis <constantinkonstantinidis@gmail.com>2018-08-20 20:29:30 +0200
committerGopher Robot <gobot@golang.org>2022-11-09 22:45:43 +0000
commitbef5eca118fab6b7dd56c31fd1957c5edc214021 (patch)
tree4c79b217636a4ebc47d12f37a35d5626433d7f0d /src/encoding/xml
parente70f74b0aa125a4e017f2b0a81e10ac41d0fd71c (diff)
downloadgo-bef5eca118fab6b7dd56c31fd1957c5edc214021.tar.xz
encoding/xml: disallow empty namespace when prefix is set
Non-regression tests are added. Fixes #8068 Change-Id: Icb36c910bbf4955743b7aa8382002b2d9246fadc Reviewed-on: https://go-review.googlesource.com/c/go/+/105636 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/encoding/xml')
-rw-r--r--src/encoding/xml/xml.go4
-rw-r--r--src/encoding/xml/xml_test.go29
2 files changed, 33 insertions, 0 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go
index d4509dfc85..2e32324415 100644
--- a/src/encoding/xml/xml.go
+++ b/src/encoding/xml/xml.go
@@ -302,6 +302,10 @@ func (d *Decoder) Token() (Token, error) {
// the translations first.
for _, a := range t1.Attr {
if a.Name.Space == xmlnsPrefix {
+ if a.Value == "" {
+ d.err = d.syntaxError("empty namespace with prefix")
+ return nil, d.err
+ }
v, ok := d.ns[a.Name.Local]
d.pushNs(a.Name.Local, v, ok)
d.ns[a.Name.Local] = a.Value
diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go
index e20dc781a1..26c4a8a74b 100644
--- a/src/encoding/xml/xml_test.go
+++ b/src/encoding/xml/xml_test.go
@@ -916,6 +916,35 @@ func TestIssue5880(t *testing.T) {
}
}
+func TestIssue8068(t *testing.T) {
+ emptyError := SyntaxError{}
+ noError := emptyError.Error()
+ testCases := []struct {
+ s string
+ wantErr SyntaxError
+ }{
+ {`<foo xmlns:bar="a"></foo>`, SyntaxError{}},
+ {`<foo xmlns:bar=""></foo>`, SyntaxError{Msg: "empty namespace with prefix", Line: 1}},
+ {`<foo xmlns:="a"></foo>`, SyntaxError{}},
+ {`<foo xmlns:""></foo>`, SyntaxError{Msg: "attribute name without = in element", Line: 1}},
+ {`<foo xmlns:"a"></foo>`, SyntaxError{Msg: "attribute name without = in element", Line: 1}},
+ }
+ var dest string
+ for _, tc := range testCases {
+ if got, want := Unmarshal([]byte(tc.s), &dest), tc.wantErr.Error(); got == nil {
+ if want != noError {
+ t.Errorf("%q: got nil, want %s", tc.s, want)
+ }
+ } else {
+ if want == "" {
+ t.Errorf("%q: got %s, want nil", tc.s, got)
+ } else if got.Error() != want {
+ t.Errorf("%q: got %s, want %s", tc.s, got, want)
+ }
+ }
+ }
+}
+
func TestIssue8535(t *testing.T) {
type ExampleConflict struct {