Merge pull request #1108 from dezgeg/fix-sigfpe
Fix SIGFPE from integer overflow during division
This commit is contained in:
		
						commit
						e02a1352c1
					
				
					 1 changed files with 9 additions and 3 deletions
				
			
		|  | @ -1516,10 +1516,16 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & | ||||||
|     NixFloat f2 = state.forceFloat(*args[1], pos); |     NixFloat f2 = state.forceFloat(*args[1], pos); | ||||||
|     if (f2 == 0) throw EvalError(format("division by zero, at %1%") % pos); |     if (f2 == 0) throw EvalError(format("division by zero, at %1%") % pos); | ||||||
| 
 | 
 | ||||||
|     if (args[0]->type == tFloat || args[1]->type == tFloat) |     if (args[0]->type == tFloat || args[1]->type == tFloat) { | ||||||
|         mkFloat(v, state.forceFloat(*args[0], pos) / state.forceFloat(*args[1], pos)); |         mkFloat(v, state.forceFloat(*args[0], pos) / state.forceFloat(*args[1], pos)); | ||||||
|     else |     } else { | ||||||
|         mkInt(v, state.forceInt(*args[0], pos) / state.forceInt(*args[1], pos)); |         NixInt i1 = state.forceInt(*args[0], pos); | ||||||
|  |         NixInt i2 = state.forceInt(*args[1], pos); | ||||||
|  |         /* Avoid division overflow as it might raise SIGFPE. */ | ||||||
|  |         if (i1 == std::numeric_limits<NixInt>::min() && i2 == -1) | ||||||
|  |             throw EvalError(format("overflow in integer division, at %1%") % pos); | ||||||
|  |         mkInt(v, i1 / i2); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue