diff options
| author | Constantin Konstantinidis <constantinkonstantinidis@gmail.com> | 2018-08-20 20:29:30 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-11-09 22:45:43 +0000 |
| commit | bef5eca118fab6b7dd56c31fd1957c5edc214021 (patch) | |
| tree | 4c79b217636a4ebc47d12f37a35d5626433d7f0d /src/encoding/xml | |
| parent | e70f74b0aa125a4e017f2b0a81e10ac41d0fd71c (diff) | |
| download | go-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.go | 4 | ||||
| -rw-r--r-- | src/encoding/xml/xml_test.go | 29 |
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 { |
