@@ -15,15 +15,15 @@ func (dec *Decoder) decodeFloat64(v *float64) error {
15
15
case ' ' , '\n' , '\t' , '\r' , ',' :
16
16
continue
17
17
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
18
- val , err := dec .getFloat (c )
18
+ val , err := dec .getFloat ()
19
19
if err != nil {
20
20
return err
21
21
}
22
22
* v = val
23
23
return nil
24
24
case '-' :
25
25
dec .cursor = dec .cursor + 1
26
- val , err := dec .getFloat ( c )
26
+ val , err := dec .getFloatNegative ( )
27
27
if err != nil {
28
28
return err
29
29
}
@@ -48,7 +48,20 @@ func (dec *Decoder) decodeFloat64(v *float64) error {
48
48
return dec .raiseInvalidJSONErr (dec .cursor )
49
49
}
50
50
51
- func (dec * Decoder ) getFloat (b byte ) (float64 , error ) {
51
+ func (dec * Decoder ) getFloatNegative () (float64 , error ) {
52
+ // look for following numbers
53
+ for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
54
+ switch dec .data [dec .cursor ] {
55
+ case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
56
+ return dec .getFloat ()
57
+ default :
58
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
59
+ }
60
+ }
61
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
62
+ }
63
+
64
+ func (dec * Decoder ) getFloat () (float64 , error ) {
52
65
var end = dec .cursor
53
66
var start = dec .cursor
54
67
// look for following numbers
@@ -73,9 +86,16 @@ func (dec *Decoder) getFloat(b byte) (float64, error) {
73
86
} else if c == 'e' || c == 'E' {
74
87
afterDecimal := dec .atoi64 (start , end )
75
88
dec .cursor = i + 1
76
- pow := pow10uint64 [end - start + 2 ]
89
+ expI := end - start + 2
90
+ if expI >= len (pow10uint64 ) || expI < 0 {
91
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
92
+ }
93
+ pow := pow10uint64 [expI ]
77
94
floatVal := float64 (beforeDecimal + afterDecimal ) / float64 (pow )
78
95
exp := dec .getExponent ()
96
+ if + exp + 1 >= int64 (len (pow10uint64 )) {
97
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
98
+ }
79
99
// if exponent is negative
80
100
if exp < 0 {
81
101
return float64 (floatVal ) * (1 / float64 (pow10uint64 [exp * - 1 + 1 ])), nil
@@ -88,14 +108,21 @@ func (dec *Decoder) getFloat(b byte) (float64, error) {
88
108
// then we add both integers
89
109
// then we divide the number by the power found
90
110
afterDecimal := dec .atoi64 (start , end )
91
- pow := pow10uint64 [end - start + 2 ]
111
+ expI := end - start + 2
112
+ if expI >= len (pow10uint64 ) || expI < 0 {
113
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
114
+ }
115
+ pow := pow10uint64 [expI ]
92
116
return float64 (beforeDecimal + afterDecimal ) / float64 (pow ), nil
93
117
case 'e' , 'E' :
94
- dec .cursor = dec . cursor + 2
118
+ dec .cursor = j + 1
95
119
// we get part before decimal as integer
96
120
beforeDecimal := uint64 (dec .atoi64 (start , end ))
97
121
// get exponent
98
122
exp := dec .getExponent ()
123
+ if + exp + 1 >= int64 (len (pow10uint64 )) {
124
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
125
+ }
99
126
// if exponent is negative
100
127
if exp < 0 {
101
128
return float64 (beforeDecimal ) * (1 / float64 (pow10uint64 [exp * - 1 + 1 ])), nil
@@ -126,15 +153,15 @@ func (dec *Decoder) decodeFloat32(v *float32) error {
126
153
case ' ' , '\n' , '\t' , '\r' , ',' :
127
154
continue
128
155
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
129
- val , err := dec .getFloat32 (c )
156
+ val , err := dec .getFloat32 ()
130
157
if err != nil {
131
158
return err
132
159
}
133
160
* v = val
134
161
return nil
135
162
case '-' :
136
163
dec .cursor = dec .cursor + 1
137
- val , err := dec .getFloat32 ( c )
164
+ val , err := dec .getFloat32Negative ( )
138
165
if err != nil {
139
166
return err
140
167
}
@@ -159,7 +186,20 @@ func (dec *Decoder) decodeFloat32(v *float32) error {
159
186
return dec .raiseInvalidJSONErr (dec .cursor )
160
187
}
161
188
162
- func (dec * Decoder ) getFloat32 (b byte ) (float32 , error ) {
189
+ func (dec * Decoder ) getFloat32Negative () (float32 , error ) {
190
+ // look for following numbers
191
+ for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
192
+ switch dec .data [dec .cursor ] {
193
+ case '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
194
+ return dec .getFloat32 ()
195
+ default :
196
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
197
+ }
198
+ }
199
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
200
+ }
201
+
202
+ func (dec * Decoder ) getFloat32 () (float32 , error ) {
163
203
var end = dec .cursor
164
204
var start = dec .cursor
165
205
// look for following numbers
@@ -184,9 +224,16 @@ func (dec *Decoder) getFloat32(b byte) (float32, error) {
184
224
} else if c == 'e' || c == 'E' {
185
225
afterDecimal := dec .atoi32 (start , end )
186
226
dec .cursor = i + 1
187
- pow := pow10uint64 [end - start + 2 ]
227
+ expI := end - start + 2
228
+ if expI >= len (pow10uint64 ) || expI < 0 {
229
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
230
+ }
231
+ pow := pow10uint64 [expI ]
188
232
floatVal := float32 (beforeDecimal + afterDecimal ) / float32 (pow )
189
233
exp := dec .getExponent ()
234
+ if + exp + 1 >= int64 (len (pow10uint64 )) {
235
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
236
+ }
190
237
// if exponent is negative
191
238
if exp < 0 {
192
239
return float32 (floatVal ) * (1 / float32 (pow10uint64 [exp * - 1 + 1 ])), nil
@@ -199,14 +246,21 @@ func (dec *Decoder) getFloat32(b byte) (float32, error) {
199
246
// then we add both integers
200
247
// then we divide the number by the power found
201
248
afterDecimal := dec .atoi32 (start , end )
202
- pow := pow10uint64 [end - start + 2 ]
249
+ expI := end - start + 2
250
+ if expI >= len (pow10uint64 ) || expI < 0 {
251
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
252
+ }
253
+ pow := pow10uint64 [expI ]
203
254
return float32 (beforeDecimal + afterDecimal ) / float32 (pow ), nil
204
255
case 'e' , 'E' :
205
- dec .cursor = dec . cursor + 2
256
+ dec .cursor = j + 1
206
257
// we get part before decimal as integer
207
258
beforeDecimal := uint32 (dec .atoi32 (start , end ))
208
259
// get exponent
209
260
exp := dec .getExponent ()
261
+ if + exp + 1 >= int64 (len (pow10uint64 )) {
262
+ return 0 , dec .raiseInvalidJSONErr (dec .cursor )
263
+ }
210
264
// if exponent is negative
211
265
if exp < 0 {
212
266
return float32 (beforeDecimal ) * (1 / float32 (pow10uint64 [exp * - 1 + 1 ])), nil
0 commit comments