diff --git a/Zend/tests/bug69957.phpt b/Zend/tests/bug69957.phpt index 3653df7d918..7f2c76b9185 100644 --- a/Zend/tests/bug69957.phpt +++ b/Zend/tests/bug69957.phpt @@ -61,21 +61,16 @@ try { ?> --EXPECTF-- -Warning: Division by zero in %sbug69957.php on line %d float(INF) Variable mod Type: Exception Message: Division by zero - -Warning: Division by zero in %sbug69957.php on line %d float(INF) Literal mod Type: Exception Message: Division by zero - -Warning: Division by zero in %sbug69957.php on line %d float(INF) Double mod diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 2b90475ba0f..7abd978079e 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1103,40 +1103,24 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* { while (1) { switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) { case TYPE_PAIR(IS_LONG, IS_LONG): - if (Z_LVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1) / (double) Z_LVAL_P(op2))); - return SUCCESS; - } else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) { - /* Prevent overflow error/crash */ - ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1); - return SUCCESS; - } - if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */ - ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2)); - } else { + /* prevent crashes (arithmetic exception) */ + if (UNEXPECTED(Z_LVAL_P(op2) == 0 || (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) || Z_LVAL_P(op1) % Z_LVAL_P(op2) != 0)) { ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2)); + return SUCCESS; + } else { + ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2)); } return SUCCESS; case TYPE_PAIR(IS_DOUBLE, IS_LONG): - if (Z_LVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2)); return SUCCESS; case TYPE_PAIR(IS_LONG, IS_DOUBLE): - if (Z_DVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2)); return SUCCESS; case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE): - if (Z_DVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2)); return SUCCESS; diff --git a/tests/run-test/test005.phpt b/tests/run-test/test005.phpt index 5dcb650444f..1413a198a67 100644 --- a/tests/run-test/test005.phpt +++ b/tests/run-test/test005.phpt @@ -19,8 +19,7 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -$zero = 0; -$error = 1 / $zero; +ini_set("zend.assertions", -1); var_dump($php_errormsg); ?> --EXPECTF-- @@ -30,4 +29,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%sivision by zer%s" +string(%d) "%senabled or disabled%s" diff --git a/tests/run-test/test006.phpt b/tests/run-test/test006.phpt index 4dca66a4f71..0ab1092a72c 100644 --- a/tests/run-test/test006.phpt +++ b/tests/run-test/test006.phpt @@ -3,7 +3,7 @@ Error messages are shown --FILE-- --EXPECTREGEX-- -.*Division by zero.* +.*enabled or disabled.* diff --git a/tests/run-test/test008a.phpt b/tests/run-test/test008a.phpt index ff2a93be0fc..954f899aca9 100644 --- a/tests/run-test/test008a.phpt +++ b/tests/run-test/test008a.phpt @@ -19,8 +19,7 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -$zero = 0; -$error = 1 / $zero; +ini_set('zend.assertions', -1); var_dump($php_errormsg); ?> --EXPECTF-- @@ -30,4 +29,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%sivision by zer%s" +string(%d) "%senabled or disabled%s"