@@ -1481,7 +1481,6 @@ impl<T: Iterator<Item = char>> Parser<T> {
1481
1481
1482
1482
fn parse_u64 ( & mut self ) -> Result < u64 , ParserError > {
1483
1483
let mut accum = 0 ;
1484
- let last_accum = 0 ; // necessary to detect overflow.
1485
1484
1486
1485
match self . ch_or_null ( ) {
1487
1486
'0' => {
@@ -1497,11 +1496,16 @@ impl<T: Iterator<Item = char>> Parser<T> {
1497
1496
while !self . eof ( ) {
1498
1497
match self . ch_or_null ( ) {
1499
1498
c @ '0' ... '9' => {
1500
- accum *= 10 ;
1501
- accum += ( c as u64 ) - ( '0' as u64 ) ;
1502
-
1503
- // Detect overflow by comparing to the last value.
1504
- if accum <= last_accum { return self . error ( InvalidNumber ) ; }
1499
+ macro_rules! try_or_invalid {
1500
+ ( $e: expr) => {
1501
+ match $e {
1502
+ Some ( v) => v,
1503
+ None => return self . error( InvalidNumber )
1504
+ }
1505
+ }
1506
+ }
1507
+ accum = try_or_invalid ! ( accum. checked_mul( 10 ) ) ;
1508
+ accum = try_or_invalid ! ( accum. checked_add( ( c as u64 ) - ( '0' as u64 ) ) ) ;
1505
1509
1506
1510
self . bump ( ) ;
1507
1511
}
@@ -1581,7 +1585,7 @@ impl<T: Iterator<Item = char>> Parser<T> {
1581
1585
1582
1586
fn decode_hex_escape ( & mut self ) -> Result < u16 , ParserError > {
1583
1587
let mut i = 0 ;
1584
- let mut n = 016 ;
1588
+ let mut n = 0 ;
1585
1589
while i < 4 && !self . eof ( ) {
1586
1590
self . bump ( ) ;
1587
1591
n = match self . ch_or_null ( ) {
@@ -2870,6 +2874,7 @@ mod tests {
2870
2874
assert_eq ! ( Json :: from_str( "1e+" ) , Err ( SyntaxError ( InvalidNumber , 1 , 4 ) ) ) ;
2871
2875
2872
2876
assert_eq ! ( Json :: from_str( "18446744073709551616" ) , Err ( SyntaxError ( InvalidNumber , 1 , 20 ) ) ) ;
2877
+ assert_eq ! ( Json :: from_str( "18446744073709551617" ) , Err ( SyntaxError ( InvalidNumber , 1 , 20 ) ) ) ;
2873
2878
assert_eq ! ( Json :: from_str( "-9223372036854775809" ) , Err ( SyntaxError ( InvalidNumber , 1 , 21 ) ) ) ;
2874
2879
2875
2880
assert_eq ! ( Json :: from_str( "3" ) , Ok ( U64 ( 3 ) ) ) ;
0 commit comments