Commit 48c6048e authored by Quentin Smith's avatar Quentin Smith

encoding/xml: check type when unmarshaling innerxml field

We only support unmarshaling into a string or a []byte, but we
previously would try (and panic while) setting a slice of a different
type. The docs say ",innerxml" is ignored if the type is not string or
[]byte, so do that for other slices as well.

Fixes #15600.

Change-Id: Ia64815945a14c3d04a0a45ccf413e38b58a69416
Reviewed-on: https://go-review.googlesource.com/32919
Run-TryBot: Quentin Smith <quentin@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 9c2037fb
...@@ -582,8 +582,10 @@ Loop: ...@@ -582,8 +582,10 @@ Loop:
case reflect.String: case reflect.String:
t.SetString(string(saveXMLData)) t.SetString(string(saveXMLData))
case reflect.Slice: case reflect.Slice:
if t.Type().Elem().Kind() == reflect.Uint8 {
t.Set(reflect.ValueOf(saveXMLData)) t.Set(reflect.ValueOf(saveXMLData))
} }
}
return nil return nil
} }
......
...@@ -733,3 +733,22 @@ func TestMalformedComment(t *testing.T) { ...@@ -733,3 +733,22 @@ func TestMalformedComment(t *testing.T) {
} }
} }
} }
type IXField struct {
Five int `xml:"five"`
NotInnerXML []string `xml:",innerxml"`
}
// Issue 15600. ",innerxml" on a field that can't hold it.
func TestInvalidInnerXMLType(t *testing.T) {
v := new(IXField)
if err := Unmarshal([]byte(`<tag><five>5</five><innertag/></tag>`), v); err != nil {
t.Errorf("Unmarshal failed: got %v", err)
}
if v.Five != 5 {
t.Errorf("Five = %v, want 5", v.Five)
}
if v.NotInnerXML != nil {
t.Errorf("NotInnerXML = %v, want nil", v.NotInnerXML)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment