From c966eaa031f68f22895faae3b0db0ac32a8d6cd7 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Tue, 18 Jul 2017 11:05:39 +0800 Subject: [PATCH] #135 fix double negative --- feature_iter_float.go | 16 ++++++++++++++++ jsoniter_invalid_test.go | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/feature_iter_float.go b/feature_iter_float.go index 57693d6..5451911 100644 --- a/feature_iter_float.go +++ b/feature_iter_float.go @@ -159,6 +159,14 @@ func (iter *Iterator) readFloat32SlowPath() (ret float32) { if iter.Error != nil && iter.Error != io.EOF { return } + if len(str) == 0 { + iter.ReportError("readFloat32SlowPath", "empty number") + return + } + if str[0] == '-' { + iter.ReportError("readFloat32SlowPath", "-- is not valid") + return + } val, err := strconv.ParseFloat(str, 32) if err != nil { iter.Error = err @@ -233,6 +241,14 @@ func (iter *Iterator) readFloat64SlowPath() (ret float64) { if iter.Error != nil && iter.Error != io.EOF { return } + if len(str) == 0 { + iter.ReportError("readFloat64SlowPath", "empty number") + return + } + if str[0] == '-' { + iter.ReportError("readFloat64SlowPath", "-- is not valid") + return + } val, err := strconv.ParseFloat(str, 64) if err != nil { iter.Error = err diff --git a/jsoniter_invalid_test.go b/jsoniter_invalid_test.go index f186ae4..5b36f2b 100644 --- a/jsoniter_invalid_test.go +++ b/jsoniter_invalid_test.go @@ -3,6 +3,7 @@ package jsoniter import ( "github.com/stretchr/testify/require" "testing" + "encoding/json" ) func Test_missing_object_end(t *testing.T) { @@ -65,3 +66,15 @@ func Test_invalid_array_input(t *testing.T) { obj := [0]string{} should.NotNil(Unmarshal(input, &obj)) } + +func Test_double_negative(t *testing.T) { + should := require.New(t) + var v interface{} + should.NotNil(json.Unmarshal([]byte(`--2`), &v)) + var vFloat64 float64 + should.NotNil(UnmarshalFromString(`--2`, &vFloat64)) + var vFloat32 float32 + should.NotNil(UnmarshalFromString(`--2`, &vFloat32)) + var vInt int + should.NotNil(UnmarshalFromString(`--2`, &vInt)) +}