summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorAndrea Faulds <ajf@ajf.me>2014-07-15 13:53:24 +0100
committerAndrea Faulds <ajf@ajf.me>2014-07-15 13:53:24 +0100
commit7148a4cf0338d5159c04da321682ce43dabccb36 (patch)
treef367a73acf43a79ea621b4dd09ef274d52b61ff6 /ext
parent6692d15e26358867f3b28d5ca83730cf156fdaf6 (diff)
downloadphp-git-7148a4cf0338d5159c04da321682ce43dabccb36.tar.gz
Added -1 safety check, fixed test
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/math.c4
-rw-r--r--ext/standard/tests/math/intdiv.phpt4
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)