From 606c6c371ad3d089d59d15393f7c49b063fc0eca Mon Sep 17 00:00:00 2001 From: shaoliming Date: Fri, 17 Jun 2022 05:01:26 +0000 Subject: [PATCH] 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 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Alex Rakoczy --- src/encoding/xml/read.go | 4 ++++ src/encoding/xml/read_test.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) 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("1"), nilPointer) + + if err == nil { + t.Fatalf("no error in unmarshalling") + } + +}