summaryrefslogtreecommitdiff
path: root/src/encoding
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2014-10-01 16:24:17 -0700
committerRobert Griesemer <gri@golang.org>2014-10-01 16:24:17 -0700
commit1e04c88a8f5749e619fa8f429f840498da297ed9 (patch)
treee11d1a00f2aa6a0bc9470668722ce3dd8bb1b63a /src/encoding
parentcaed88cb1883491028f889e844751c4a8ebb461d (diff)
downloadgo-1e04c88a8f5749e619fa8f429f840498da297ed9.tar.gz
encoding/json: don't panic on incorrect map argument
Fixes issue 8305. LGTM=rsc R=rsc CC=golang-codereviews https://codereview.appspot.com/145680044
Diffstat (limited to 'src/encoding')
-rw-r--r--src/encoding/json/decode.go6
-rw-r--r--src/encoding/json/decode_test.go12
2 files changed, 15 insertions, 3 deletions
diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go
index af1c908ad..67ec37388 100644
--- a/src/encoding/json/decode.go
+++ b/src/encoding/json/decode.go
@@ -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))
diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go
index 238a87fd6..d95657d72 100644
--- a/src/encoding/json/decode_test.go
+++ b/src/encoding/json/decode_test.go
@@ -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) {