. Fixed bug #69768 (escapeshell*() doesn't cater to !). (cmb)
. Fixed bug #69955 (Segfault when trying to combine [] and assign-op on
ArrayAccess object). (Laruence)
- . Fixed bug #69957 (Three different ways of handling same error condition).
- (Bob)
- CLI server:
. Fixed bug #69655 (php -S changes MKCALENDAR request method to MKCOL). (cmb)
+++ /dev/null
---TEST--
-Bug #69957 (Different ways of handling div/mod by zero)
---FILE--
-<?php
-
-try {
- $divisor = 0;
- $result = 1 / $divisor;
-} catch (Throwable $t){
- echo "Variable div\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-try {
- $divisor = 0;
- $result = 1 % $divisor;
-} catch (Throwable $t){
- echo "\nVariable mod\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-try {
- $result = 1 / 0;
-} catch (Throwable $t){
- echo "\nLiteral div\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-try {
- $result = 1 % 0;
-} catch (Throwable $t){
- echo "\nLiteral mod\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-try {
- $result = 1 / 0.0;
-} catch (Throwable $t){
- echo "\nDouble div\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-try {
- $result = 1 % 0.0;
-} catch (Throwable $t){
- echo "\nDouble mod\n";
- printf("Type: %s\n", get_class($t));
- printf("Message: %s\n", $t->getMessage());
-}
-
-?>
---EXPECT--
-Variable div
-Type: Error
-Message: Division by zero
-
-Variable mod
-Type: Error
-Message: Modulo by zero
-
-Literal div
-Type: Error
-Message: Division by zero
-
-Literal mod
-Type: Error
-Message: Modulo by zero
-
-Double div
-Type: Error
-Message: Division by zero
-
-Double mod
-Type: Error
-Message: Modulo by zero
binary_op_type fn = get_binary_op(opcode);
/* don't evaluate division by zero at compile-time */
- if (opcode == ZEND_DIV || opcode == ZEND_MOD) {
+ if (opcode == ZEND_DIV) {
convert_scalar_to_number(op2);
if (Z_TYPE_P(op2) == IS_LONG) {
if (Z_LVAL_P(op2) == 0) {
while (1) {
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
case TYPE_PAIR(IS_LONG, IS_LONG):
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- if (EG(current_execute_data) && !CG(in_compilation)) {
- zend_error(E_ERROR | E_EXCEPTION, "Division by zero");
- } else {
- zend_error_noreturn(E_ERROR, "Division by zero");
- }
+ 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 (UNEXPECTED(Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN)) {
+ } 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;
- } else if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
+ }
+ if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
} else {
ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
return SUCCESS;
case TYPE_PAIR(IS_DOUBLE, IS_LONG):
- if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
- if (EG(current_execute_data) && !CG(in_compilation)) {
- zend_error(E_ERROR | E_EXCEPTION, "Division by zero");
- } else {
- zend_error_noreturn(E_ERROR, "Division by zero");
- }
+ 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 (UNEXPECTED(Z_DVAL_P(op2) == 0)) {
- if (EG(current_execute_data) && !CG(in_compilation)) {
- zend_error(E_ERROR | E_EXCEPTION, "Division by zero");
- } else {
- zend_error_noreturn(E_ERROR, "Division by zero");
- }
+ 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 (UNEXPECTED(Z_DVAL_P(op2) == 0)) {
- if (EG(current_execute_data) && !CG(in_compilation)) {
- zend_error(E_ERROR | E_EXCEPTION, "Division by zero");
- } else {
- zend_error_noreturn(E_ERROR, "Division by zero");
- }
+ 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;
zval_dtor(result);
}
- if (UNEXPECTED(op2_lval == 0)) {
+ if (op2_lval == 0) {
/* modulus by zero */
if (EG(current_execute_data) && !CG(in_compilation)) {
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
} else {
- zend_error_noreturn(E_ERROR, "Modulo by zero");
+ zend_error_noreturn(E_ERROR, "Division by zero");
}
ZVAL_UNDEF(result);
return FAILURE;
- } else if (UNEXPECTED(op2_lval == -1)) {
- /* Prevent overflow error/crash if op1 == LONG_MIN */
+ }
+
+ if (op2_lval == -1) {
+ /* Prevent overflow error/crash if op1==LONG_MIN */
ZVAL_LONG(result, 0);
- } else {
- ZVAL_LONG(result, op1_lval % op2_lval);
+ return SUCCESS;
}
+
+ ZVAL_LONG(result, op1_lval % op2_lval);
return SUCCESS;
}
/* }}} */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */
result = EX_VAR(opline->result.var);
if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
SAVE_OPLINE();
- zend_error(E_ERROR | E_EXCEPTION, "Modulo by zero");
+ zend_throw_exception_ex(NULL, 0, "Division by zero");
HANDLE_EXCEPTION();
} else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
/* Prevent overflow error/crash if op1==ZEND_LONG_MIN */