@@ -15,15 +15,15 @@ func (dec *Decoder) decodeFloat64(v *float64) error {
1515		case  ' ' , '\n' , '\t' , '\r' , ',' :
1616			continue 
1717		case  '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
18- 			val , err  :=  dec .getFloat (c )
18+ 			val , err  :=  dec .getFloat ()
1919			if  err  !=  nil  {
2020				return  err 
2121			}
2222			* v  =  val 
2323			return  nil 
2424		case  '-' :
2525			dec .cursor  =  dec .cursor  +  1 
26- 			val , err  :=  dec .getFloat ( c )
26+ 			val , err  :=  dec .getFloatNegative ( )
2727			if  err  !=  nil  {
2828				return  err 
2929			}
@@ -48,7 +48,20 @@ func (dec *Decoder) decodeFloat64(v *float64) error {
4848	return  dec .raiseInvalidJSONErr (dec .cursor )
4949}
5050
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 ) {
5265	var  end  =  dec .cursor 
5366	var  start  =  dec .cursor 
5467	// look for following numbers 
@@ -73,9 +86,16 @@ func (dec *Decoder) getFloat(b byte) (float64, error) {
7386				} else  if  c  ==  'e'  ||  c  ==  'E'  {
7487					afterDecimal  :=  dec .atoi64 (start , end )
7588					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 ]
7794					floatVal  :=  float64 (beforeDecimal + afterDecimal ) /  float64 (pow )
7895					exp  :=  dec .getExponent ()
96+ 					if  + exp + 1  >=  int64 (len (pow10uint64 )) {
97+ 						return  0 , dec .raiseInvalidJSONErr (dec .cursor )
98+ 					}
7999					// if exponent is negative 
80100					if  exp  <  0  {
81101						return  float64 (floatVal ) *  (1  /  float64 (pow10uint64 [exp * - 1 + 1 ])), nil 
@@ -88,14 +108,21 @@ func (dec *Decoder) getFloat(b byte) (float64, error) {
88108			// then we add both integers 
89109			// then we divide the number by the power found 
90110			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 ]
92116			return  float64 (beforeDecimal + afterDecimal ) /  float64 (pow ), nil 
93117		case  'e' , 'E' :
94- 			dec .cursor  =  dec . cursor  +  2 
118+ 			dec .cursor  =  j  +  1 
95119			// we get part before decimal as integer 
96120			beforeDecimal  :=  uint64 (dec .atoi64 (start , end ))
97121			// get exponent 
98122			exp  :=  dec .getExponent ()
123+ 			if  + exp + 1  >=  int64 (len (pow10uint64 )) {
124+ 				return  0 , dec .raiseInvalidJSONErr (dec .cursor )
125+ 			}
99126			// if exponent is negative 
100127			if  exp  <  0  {
101128				return  float64 (beforeDecimal ) *  (1  /  float64 (pow10uint64 [exp * - 1 + 1 ])), nil 
@@ -126,15 +153,15 @@ func (dec *Decoder) decodeFloat32(v *float32) error {
126153		case  ' ' , '\n' , '\t' , '\r' , ',' :
127154			continue 
128155		case  '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
129- 			val , err  :=  dec .getFloat32 (c )
156+ 			val , err  :=  dec .getFloat32 ()
130157			if  err  !=  nil  {
131158				return  err 
132159			}
133160			* v  =  val 
134161			return  nil 
135162		case  '-' :
136163			dec .cursor  =  dec .cursor  +  1 
137- 			val , err  :=  dec .getFloat32 ( c )
164+ 			val , err  :=  dec .getFloat32Negative ( )
138165			if  err  !=  nil  {
139166				return  err 
140167			}
@@ -159,7 +186,20 @@ func (dec *Decoder) decodeFloat32(v *float32) error {
159186	return  dec .raiseInvalidJSONErr (dec .cursor )
160187}
161188
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 ) {
163203	var  end  =  dec .cursor 
164204	var  start  =  dec .cursor 
165205	// look for following numbers 
@@ -184,9 +224,16 @@ func (dec *Decoder) getFloat32(b byte) (float32, error) {
184224				} else  if  c  ==  'e'  ||  c  ==  'E'  {
185225					afterDecimal  :=  dec .atoi32 (start , end )
186226					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 ]
188232					floatVal  :=  float32 (beforeDecimal + afterDecimal ) /  float32 (pow )
189233					exp  :=  dec .getExponent ()
234+ 					if  + exp + 1  >=  int64 (len (pow10uint64 )) {
235+ 						return  0 , dec .raiseInvalidJSONErr (dec .cursor )
236+ 					}
190237					// if exponent is negative 
191238					if  exp  <  0  {
192239						return  float32 (floatVal ) *  (1  /  float32 (pow10uint64 [exp * - 1 + 1 ])), nil 
@@ -199,14 +246,21 @@ func (dec *Decoder) getFloat32(b byte) (float32, error) {
199246			// then we add both integers 
200247			// then we divide the number by the power found 
201248			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 ]
203254			return  float32 (beforeDecimal + afterDecimal ) /  float32 (pow ), nil 
204255		case  'e' , 'E' :
205- 			dec .cursor  =  dec . cursor  +  2 
256+ 			dec .cursor  =  j  +  1 
206257			// we get part before decimal as integer 
207258			beforeDecimal  :=  uint32 (dec .atoi32 (start , end ))
208259			// get exponent 
209260			exp  :=  dec .getExponent ()
261+ 			if  + exp + 1  >=  int64 (len (pow10uint64 )) {
262+ 				return  0 , dec .raiseInvalidJSONErr (dec .cursor )
263+ 			}
210264			// if exponent is negative 
211265			if  exp  <  0  {
212266				return  float32 (beforeDecimal ) *  (1  /  float32 (pow10uint64 [exp * - 1 + 1 ])), nil 
0 commit comments