]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: Fix panic when trying to unmarshal the empty string into an integer
authorMichael Chaten <mchaten@gmail.com>
Thu, 3 May 2012 21:35:44 +0000 (17:35 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 3 May 2012 21:35:44 +0000 (17:35 -0400)
Fixes #3450.

R=rsc, bradfitz
CC=golang-dev
https://golang.org/cl/6035050

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

index 701cba9bd048e75c187ed419c14dfc5ecb44fc75..0018e534ccf7e73cb3113365e1d9cbe293bc5377 100644 (file)
@@ -593,6 +593,11 @@ func (d *decodeState) literal(v reflect.Value) {
 // produce more helpful error messages.
 func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) {
        // Check for unmarshaler.
+       if len(item) == 0 {
+               //Empty string given
+               d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+               return
+       }
        wantptr := item[0] == 'n' // null
        unmarshaler, pv := d.indirect(v, wantptr)
        if unmarshaler != nil {
index 78768c8ba19443cdd0a85c1bcfd485f5235ad9aa..4f6a9b64ef89e9c94c0c1dbfcf4925813244c65c 100644 (file)
@@ -646,3 +646,22 @@ func TestAnonymous(t *testing.T) {
                t.Fatal("Unmarshal: did set T.Y")
        }
 }
+
+// Test that the empty string doesn't panic decoding when ,string is specified
+// Issue 3450
+func TestEmptyString(t *testing.T) {
+       type T2 struct {
+               Number1 int `json:",string"`
+               Number2 int `json:",string"`
+       }
+       data := `{"Number1":"1", "Number2":""}`
+       dec := NewDecoder(strings.NewReader(data))
+       var t2 T2
+       err := dec.Decode(&t2)
+       if err == nil {
+               t.Fatal("Decode: did not return error")
+       }
+       if t2.Number1 != 1 {
+               t.Fatal("Decode: did not set Number1")
+       }
+}