]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: don't panic on incorrect map argument
authorRobert Griesemer <gri@golang.org>
Wed, 1 Oct 2014 23:24:17 +0000 (16:24 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 1 Oct 2014 23:24:17 +0000 (16:24 -0700)
Fixes #8305.

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/145680044

src/encoding/json/decode.go
src/encoding/json/decode_test.go

index af1c908ad77d61f49d2aa6abded0a936480a867f..67ec37388f8bb636ce703233b24e7c0203bc31c5 100644 (file)
@@ -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))
index 238a87fd665a88a1e21485c3054c31693a9839a6..d95657d7292984b259e27b817a478a76f952eec8 100644 (file)
@@ -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) {