aboutsummaryrefslogtreecommitdiff
path: root/src/encoding
diff options
context:
space:
mode:
authorshaoliming <shaojacobi@gmail.com>2022-06-17 05:01:26 +0000
committerGopher Robot <gobot@golang.org>2022-06-22 16:23:59 +0000
commit606c6c371ad3d089d59d15393f7c49b063fc0eca (patch)
tree87dd193ed1cf2c672af8fb8394b05dc919fde285 /src/encoding
parentf5715181392c68d928c3152f8cf90fa9d4ee9e4e (diff)
downloadgo-606c6c371ad3d089d59d15393f7c49b063fc0eca.tar.xz
encoding/xml: check nil pointer in DecodeElement
Fixes #53350 Change-Id: Id5e1f4016db5f1d4349ee1a76a9dfe3aeae83cee GitHub-Last-Rev: 45add121612a8144c2525828bd7386c4adb05174 GitHub-Pull-Request: golang/go#53407 Reviewed-on: https://go-review.googlesource.com/c/go/+/412634 Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Alex Rakoczy <alex@golang.org>
Diffstat (limited to 'src/encoding')
-rw-r--r--src/encoding/xml/read.go4
-rw-r--r--src/encoding/xml/read_test.go15
2 files changed, 19 insertions, 0 deletions
diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go
index 565d9a8bea..257591262f 100644
--- a/src/encoding/xml/read.go
+++ b/src/encoding/xml/read.go
@@ -148,6 +148,10 @@ func (d *Decoder) DecodeElement(v any, start *StartElement) error {
if val.Kind() != reflect.Pointer {
return errors.New("non-pointer passed to Unmarshal")
}
+
+ if val.IsNil() {
+ return errors.New("nil pointer passed to Unmarshal")
+ }
return d.unmarshal(val.Elem(), start)
}
diff --git a/src/encoding/xml/read_test.go b/src/encoding/xml/read_test.go
index 391fe731a8..6ef55de77b 100644
--- a/src/encoding/xml/read_test.go
+++ b/src/encoding/xml/read_test.go
@@ -1079,3 +1079,18 @@ func TestUnmarshalWhitespaceAttrs(t *testing.T) {
t.Fatalf("whitespace attrs: Unmarshal:\nhave: %#+v\nwant: %#+v", v, want)
}
}
+
+// golang.org/issues/53350
+func TestUnmarshalIntoNil(t *testing.T) {
+ type T struct {
+ A int `xml:"A"`
+ }
+
+ var nilPointer *T
+ err := Unmarshal([]byte("<T><A>1</A></T>"), nilPointer)
+
+ if err == nil {
+ t.Fatalf("no error in unmarshalling")
+ }
+
+}