@@ -106,16 +106,20 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result<PreciseNumber, ParseNu
106106
107107 let num_integral_digits = if is_minus_zero_float ( s, & x) {
108108 if exponent > 0 {
109- 2usize + exponent as usize
109+ ( 2usize )
110+ . checked_add ( exponent as usize )
111+ . ok_or ( ParseNumberError :: Float ) ?
110112 } else {
111113 2usize
112114 }
113115 } else {
114- let total = j as i64 + exponent;
116+ let total = ( j as i64 )
117+ . checked_add ( exponent)
118+ . ok_or ( ParseNumberError :: Float ) ?;
115119 let result = if total < 1 {
116120 1
117121 } else {
118- total. try_into ( ) . unwrap ( )
122+ total. try_into ( ) . map_err ( |_| ParseNumberError :: Float ) ?
119123 } ;
120124 if x. sign ( ) == Sign :: Minus {
121125 result + 1
@@ -207,7 +211,9 @@ fn parse_decimal_and_exponent(
207211 let integral_part: f64 = s[ ..j] . parse ( ) . map_err ( |_| ParseNumberError :: Float ) ?;
208212 if integral_part. is_sign_negative ( ) {
209213 if exponent > 0 {
210- 2usize + exponent as usize
214+ 2usize
215+ . checked_add ( exponent as usize )
216+ . ok_or ( ParseNumberError :: Float ) ?
211217 } else {
212218 2usize
213219 }
@@ -217,15 +223,20 @@ fn parse_decimal_and_exponent(
217223 } ;
218224 // Special case: if the string is "-.1e2", we need to treat it
219225 // as if it were "-0.1e2".
220- let total = if s. starts_with ( "-." ) {
221- i as i64 + exponent + 1
222- } else {
223- i as i64 + exponent
226+ let total = {
227+ let total = ( i as i64 )
228+ . checked_add ( exponent)
229+ . ok_or ( ParseNumberError :: Float ) ?;
230+ if s. starts_with ( "-." ) {
231+ total. checked_add ( 1 ) . ok_or ( ParseNumberError :: Float ) ?
232+ } else {
233+ total
234+ }
224235 } ;
225236 if total < minimum as i64 {
226237 minimum
227238 } else {
228- total. try_into ( ) . unwrap ( )
239+ total. try_into ( ) . map_err ( |_| ParseNumberError :: Float ) ?
229240 }
230241 } ;
231242
0 commit comments