diff options
| author | Andrea Faulds <ajf@ajf.me> | 2014-07-15 13:53:24 +0100 |
|---|---|---|
| committer | Andrea Faulds <ajf@ajf.me> | 2014-07-15 13:53:24 +0100 |
| commit | 7148a4cf0338d5159c04da321682ce43dabccb36 (patch) | |
| tree | f367a73acf43a79ea621b4dd09ef274d52b61ff6 /ext | |
| parent | 6692d15e26358867f3b28d5ca83730cf156fdaf6 (diff) | |
| download | php-git-7148a4cf0338d5159c04da321682ce43dabccb36.tar.gz | |
Added -1 safety check, fixed test
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/standard/math.c | 4 | ||||
| -rw-r--r-- | ext/standard/tests/math/intdiv.phpt | 4 |
2 files changed, 7 insertions, 1 deletions
diff --git a/ext/standard/math.c b/ext/standard/math.c index e8260ec24d..8a4b0459d5 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -1260,6 +1260,10 @@ PHP_FUNCTION(intdiv) if (divisor == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero"); RETURN_BOOL(0); + } else if (divisor == -1 && numerator == LONG_MIN) { + /* Prevent overflow error/crash + We don't return a float here as that violates function contract */ + RETURN_LONG(0); } RETURN_LONG(numerator/divisor); diff --git a/ext/standard/tests/math/intdiv.phpt b/ext/standard/tests/math/intdiv.phpt index 449434d7c7..d37d2e8004 100644 --- a/ext/standard/tests/math/intdiv.phpt +++ b/ext/standard/tests/math/intdiv.phpt @@ -8,6 +8,7 @@ var_dump(intdiv(3, -2)); var_dump(intdiv(-3, -2)); var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX)); var_dump(intdiv(-PHP_INT_MAX - 1, -PHP_INT_MAX - 1)); +var_dump(intdiv(-PHP_INT_MAX - 1, -1)); var_dump(intdiv(1, 0)); ?> @@ -18,6 +19,7 @@ int(-1) int(1) int(1) int(1) +int(0) -Warning: Division by zero in %s on line 8 +Warning: intdiv(): Division by zero in %s on line 9 bool(false) |
