diff options
author | Ian Lance Taylor <iant@golang.org> | 2017-12-06 18:02:02 -0800 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2017-12-07 05:09:01 +0000 |
commit | 89d7a2fbda06976858cd00451d6eee81fffd9aea (patch) | |
tree | 07be085587965be9d49ce7439c1efbe469b712f2 | |
parent | 617fc0ffd3dabd24a43a713af0a05a7f93516d36 (diff) | |
download | go-89d7a2fbda06976858cd00451d6eee81fffd9aea.tar.gz go-89d7a2fbda06976858cd00451d6eee81fffd9aea.zip |
encoding/xml: don't crash on invalid XMLName tag
Fixes #20953
Change-Id: Ia30a6e0e335c1f738e1359500e09057b5981f1c7
Reviewed-on: https://go-review.googlesource.com/82397
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/encoding/xml/marshal_test.go | 19 | ||||
-rw-r--r-- | src/encoding/xml/typeinfo.go | 2 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/encoding/xml/marshal_test.go b/src/encoding/xml/marshal_test.go index 11f451270a..5c79a48e7a 100644 --- a/src/encoding/xml/marshal_test.go +++ b/src/encoding/xml/marshal_test.go @@ -2441,3 +2441,22 @@ func TestIssue16158(t *testing.T) { t.Errorf("Unmarshal: expected error, got nil") } } + +// Issue 20953. Crash on invalid XMLName attribute. + +type InvalidXMLName struct { + XMLName Name `xml:"error"` + Type struct { + XMLName Name `xml:"type,attr"` + } +} + +func TestInvalidXMLName(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.Encode(InvalidXMLName{}); err == nil { + t.Error("unexpected success") + } else if want := "invalid tag"; !strings.Contains(err.Error(), want) { + t.Errorf("error %q does not contain %q", err, want) + } +} diff --git a/src/encoding/xml/typeinfo.go b/src/encoding/xml/typeinfo.go index 2e7ae935a8..48de3d7e9e 100644 --- a/src/encoding/xml/typeinfo.go +++ b/src/encoding/xml/typeinfo.go @@ -241,7 +241,7 @@ func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { continue } finfo, err := structFieldInfo(typ, &f) - if finfo.name != "" && err == nil { + if err == nil && finfo.name != "" { return finfo } // Also consider errors as a non-existent field tag |