Skip to content

Commit 7e8218a

Browse files
committed
encoding/json: don't panic on incorrect map argument
Fixes golang#8305. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/145680044
1 parent 94f3d8c commit 7e8218a

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

src/encoding/json/decode.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ func (d *decodeState) array(v reflect.Value) {
445445
}
446446

447447
// object consumes an object from d.data[d.off-1:], decoding into the value v.
448-
// the first byte of the object ('{') has been read already.
448+
// the first byte ('{') of the object has been read already.
449449
func (d *decodeState) object(v reflect.Value) {
450450
// Check for unmarshaler.
451451
u, ut, pv := d.indirect(v, false)
@@ -478,7 +478,9 @@ func (d *decodeState) object(v reflect.Value) {
478478
t := v.Type()
479479
if t.Key().Kind() != reflect.String {
480480
d.saveError(&UnmarshalTypeError{"object", v.Type()})
481-
break
481+
d.off--
482+
d.next() // skip over { } in input
483+
return
482484
}
483485
if v.IsNil() {
484486
v.Set(reflect.MakeMap(t))

src/encoding/json/decode_test.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,13 @@ var unmarshalTests = []unmarshalTest{
406406
ptr: new(string),
407407
out: "hello\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdworld",
408408
},
409+
410+
// issue 8305
411+
{
412+
in: `{"2009-11-10T23:00:00Z": "hello world"}`,
413+
ptr: &map[time.Time]string{},
414+
err: &UnmarshalTypeError{"object", reflect.TypeOf(map[time.Time]string{})},
415+
},
409416
}
410417

411418
func TestMarshal(t *testing.T) {
@@ -514,14 +521,17 @@ func TestUnmarshal(t *testing.T) {
514521
if tt.ptr == nil {
515522
continue
516523
}
524+
517525
// v = new(right-type)
518526
v := reflect.New(reflect.TypeOf(tt.ptr).Elem())
519527
dec := NewDecoder(bytes.NewReader(in))
520528
if tt.useNumber {
521529
dec.UseNumber()
522530
}
523531
if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
524-
t.Errorf("#%d: %v want %v", i, err, tt.err)
532+
t.Errorf("#%d: %v, want %v", i, err, tt.err)
533+
continue
534+
} else if err != nil {
525535
continue
526536
}
527537
if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {

0 commit comments

Comments
 (0)