Skip to content

Commit

Permalink
encoding/xml: disallow empty namespace when prefix is set
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
iwdgo authored and pull[bot] committed Mar 9, 2023
1 parent c4a855f commit 2447027
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/encoding/xml/xml.go
Expand Up @@ -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
Expand Down
29 changes: 29 additions & 0 deletions src/encoding/xml/xml_test.go
Expand Up @@ -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 {
Expand Down

0 comments on commit 2447027

Please sign in to comment.