mirror of
https://github.com/golang/go.git
synced 2025-05-25 17:31:22 +00:00
encoding/json: don't panic on incorrect map argument
Fixes #8305. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/145680044
This commit is contained in:
parent
94f3d8cfed
commit
7e8218aedd
@ -445,7 +445,7 @@ func (d *decodeState) array(v reflect.Value) {
|
||||
}
|
||||
|
||||
// object consumes an object from d.data[d.off-1:], decoding into the value v.
|
||||
// the first byte of the object ('{') has been read already.
|
||||
// the first byte ('{') of the object has been read already.
|
||||
func (d *decodeState) object(v reflect.Value) {
|
||||
// Check for unmarshaler.
|
||||
u, ut, pv := d.indirect(v, false)
|
||||
@ -478,7 +478,9 @@ func (d *decodeState) object(v reflect.Value) {
|
||||
t := v.Type()
|
||||
if t.Key().Kind() != reflect.String {
|
||||
d.saveError(&UnmarshalTypeError{"object", v.Type()})
|
||||
break
|
||||
d.off--
|
||||
d.next() // skip over { } in input
|
||||
return
|
||||
}
|
||||
if v.IsNil() {
|
||||
v.Set(reflect.MakeMap(t))
|
||||
|
@ -406,6 +406,13 @@ var unmarshalTests = []unmarshalTest{
|
||||
ptr: new(string),
|
||||
out: "hello\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdworld",
|
||||
},
|
||||
|
||||
// issue 8305
|
||||
{
|
||||
in: `{"2009-11-10T23:00:00Z": "hello world"}`,
|
||||
ptr: &map[time.Time]string{},
|
||||
err: &UnmarshalTypeError{"object", reflect.TypeOf(map[time.Time]string{})},
|
||||
},
|
||||
}
|
||||
|
||||
func TestMarshal(t *testing.T) {
|
||||
@ -514,6 +521,7 @@ func TestUnmarshal(t *testing.T) {
|
||||
if tt.ptr == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// v = new(right-type)
|
||||
v := reflect.New(reflect.TypeOf(tt.ptr).Elem())
|
||||
dec := NewDecoder(bytes.NewReader(in))
|
||||
@ -521,7 +529,9 @@ func TestUnmarshal(t *testing.T) {
|
||||
dec.UseNumber()
|
||||
}
|
||||
if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
|
||||
t.Errorf("#%d: %v want %v", i, err, tt.err)
|
||||
t.Errorf("#%d: %v, want %v", i, err, tt.err)
|
||||
continue
|
||||
} else if err != nil {
|
||||
continue
|
||||
}
|
||||
if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user