From 8f27a81d902882950b247626fee3b0f3cf2bf855 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 1 Apr 2018 22:01:15 +0000 Subject: [PATCH 1/2] Add a test for input errors Send various malformed JSON strings into the decoder for each type, and check we get an error each time. --- value_tests/error_test.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 value_tests/error_test.go diff --git a/value_tests/error_test.go b/value_tests/error_test.go new file mode 100644 index 0000000..175a24e --- /dev/null +++ b/value_tests/error_test.go @@ -0,0 +1,36 @@ +package test + +import ( + "github.com/json-iterator/go" + "github.com/stretchr/testify/require" + "reflect" + "testing" +) + +func Test_errorInput(t *testing.T) { + for _, testCase := range unmarshalCases { + if testCase.obj != nil { + continue + } + valType := reflect.TypeOf(testCase.ptr).Elem() + t.Run(valType.String(), func(t *testing.T) { + for _, data := range []string{ + `x`, + `n`, + `nul`, + `{x}`, + `{"x"}`, + `{"x": "y"x}`, + `{"x": "y"`, + `{"x": "y", "a"}`, + `[`, + `[{"x": "y"}`, + } { + ptrVal := reflect.New(valType) + ptr := ptrVal.Interface() + err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(data), ptr) + require.Error(t, err, "on input %q", data) + } + }) + } +} From b53656d4599d43670390e61c720aae5236f70131 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 1 Apr 2018 22:02:44 +0000 Subject: [PATCH 2/2] Check that a struct ends with closing brace --- reflect_struct_decoder.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reflect_struct_decoder.go b/reflect_struct_decoder.go index d30397f..fd76647 100644 --- a/reflect_struct_decoder.go +++ b/reflect_struct_decoder.go @@ -494,13 +494,16 @@ func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) if !iter.readObjectStart() { return } - decoder.decodeOneField(ptr, iter) - for iter.nextToken() == ',' { + var c byte + for c = ','; c == ','; c = iter.nextToken() { decoder.decodeOneField(ptr, iter) } if iter.Error != nil && iter.Error != io.EOF { iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } + if c != '}' { + iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) + } } func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) {