Merge pull request #390 from qwename/integer-overflow
🔀 fix issue #380: Signed integer overflow check
This commit is contained in:
		
						commit
						4e2fb1a533
					
				
					 2 changed files with 12 additions and 12 deletions
				
			
		
							
								
								
									
										12
									
								
								src/json.hpp
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/json.hpp
									
										
									
									
									
								
							|  | @ -10619,19 +10619,19 @@ basic_json_parser_66: | |||
|                 // skip if definitely not an integer
 | ||||
|                 if (type != value_t::number_float) | ||||
|                 { | ||||
|                     // multiply last value by ten and add the new digit
 | ||||
|                     auto temp = value * 10 + *curptr - '0'; | ||||
|                     auto digit = static_cast<number_unsigned_t>(*curptr - '0'); | ||||
| 
 | ||||
|                     // test for overflow
 | ||||
|                     if (temp < value || temp > max) | ||||
|                     // overflow if value * 10 + digit > max, move terms around
 | ||||
|                     // to avoid overflow in intermediate values
 | ||||
|                     if (value > (max - digit) / 10) | ||||
|                     { | ||||
|                         // overflow
 | ||||
|                         type = value_t::number_float; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // no overflow - save it
 | ||||
|                         value = temp; | ||||
|                         // no overflow
 | ||||
|                         value = value * 10 + digit; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -9769,19 +9769,19 @@ class basic_json | |||
|                 // skip if definitely not an integer | ||||
|                 if (type != value_t::number_float) | ||||
|                 { | ||||
|                     // multiply last value by ten and add the new digit | ||||
|                     auto temp = value * 10 + *curptr - '0'; | ||||
|                     auto digit = static_cast<number_unsigned_t>(*curptr - '0'); | ||||
| 
 | ||||
|                     // test for overflow | ||||
|                     if (temp < value || temp > max) | ||||
|                     // overflow if value * 10 + digit > max, move terms around | ||||
|                     // to avoid overflow in intermediate values | ||||
|                     if (value > (max - digit) / 10) | ||||
|                     { | ||||
|                         // overflow | ||||
|                         type = value_t::number_float; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // no overflow - save it | ||||
|                         value = temp; | ||||
|                         // no overflow | ||||
|                         value = value * 10 + digit; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue