From f7df62f1b56e80bb0ad0b10c491fef46805097fe Mon Sep 17 00:00:00 2001 From: Tao Wen <taowen@gmail.com> Date: Thu, 6 Jul 2017 16:04:52 +0800 Subject: [PATCH] #115 check object end --- feature_iter.go | 12 ++++++++++++ feature_reflect_object.go | 20 ++++++++++---------- jsoniter_invalid_test.go | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 jsoniter_invalid_test.go diff --git a/feature_iter.go b/feature_iter.go index 2683b95..05fc9ee 100644 --- a/feature_iter.go +++ b/feature_iter.go @@ -154,6 +154,18 @@ func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool { return true } +func (iter *Iterator) isObjectEnd() bool { + c := iter.nextToken() + if c == ',' { + return false + } + if c == '}' { + return true + } + iter.ReportError("isObjectEnd", "object ended prematurely") + return true +} + func (iter *Iterator) nextToken() byte { // a variation of skip whitespaces, returning the next non-whitespace token for { diff --git a/feature_reflect_object.go b/feature_reflect_object.go index dcfca2b..c815a94 100644 --- a/feature_reflect_object.go +++ b/feature_reflect_object.go @@ -586,7 +586,7 @@ func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) } else { iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -616,7 +616,7 @@ func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -650,7 +650,7 @@ func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -688,7 +688,7 @@ func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -730,7 +730,7 @@ func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -776,7 +776,7 @@ func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -826,7 +826,7 @@ func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -880,7 +880,7 @@ func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -938,7 +938,7 @@ func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } @@ -1000,7 +1000,7 @@ func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator default: iter.Skip() } - if iter.nextToken() != ',' { + if iter.isObjectEnd() { break } } diff --git a/jsoniter_invalid_test.go b/jsoniter_invalid_test.go new file mode 100644 index 0000000..e764b57 --- /dev/null +++ b/jsoniter_invalid_test.go @@ -0,0 +1,21 @@ +package jsoniter + +import ( + "testing" + "github.com/json-iterator/go/require" +) + +func Test_missing_object_end(t *testing.T) { + should := require.New(t) + type TestObject struct { + Metric string `json:"metric"` + Tags map[string]interface{} `json:"tags"` + } + obj := TestObject{} + should.NotNil(UnmarshalFromString(`{"metric": "sys.777","tags": {"a":"123"}`, &obj)) +} + +func Test_missing_array_end(t *testing.T) { + should := require.New(t) + should.NotNil(UnmarshalFromString(`[1,2,3`, &[]int{})) +}