]> granicus.if.org Git - php/commitdiff
Reverted wrong fb08798c9f0ea820d567668d0cea4833dc61dd8e
authorDmitry Stogov <dmitry@zend.com>
Mon, 29 Jun 2015 09:20:09 +0000 (12:20 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 29 Jun 2015 09:20:09 +0000 (12:20 +0300)
NEWS
Zend/tests/bug69957.phpt [deleted file]
Zend/zend_compile.c
Zend/zend_operators.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index b3b1e27774fc7884d7f1679a48cb2e21804d447f..3881e97e2b7ed49bd67db7614f97fdd06f3e9132 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,8 +6,6 @@ PHP                                                                        NEWS
   . 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)
diff --git a/Zend/tests/bug69957.phpt b/Zend/tests/bug69957.phpt
deleted file mode 100644 (file)
index d6f441b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
---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
index 84525683821dba2d90573c1fb0aa7cbfe27a68e4..a42e63ec9933296ccde7c27fa6e7141010c8b8b6 100644 (file)
@@ -5625,7 +5625,7 @@ static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode
        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) {
index 9439296657359094afd6b2e21a999404029616fe..d9670a5a499b1931072601e8d954af5cd5d8192a 100644 (file)
@@ -1103,19 +1103,16 @@ 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 (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));
@@ -1123,34 +1120,22 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *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;
@@ -1185,21 +1170,24 @@ ZEND_API int ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2) /* {
                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;
 }
 /* }}} */
index ab8a2f55100d9bba5fc058ca33fa6e97801d809d..be9b012e8bd01b820e556f30f35a8d18ae070b63 100644 (file)
@@ -189,7 +189,7 @@ ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
                        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 */
index 93026bd185bb7e29050f26ab4f7cc9a1aeaa9243..180bcd18c3aee19eab817c0db72fec953dd80dee 100644 (file)
@@ -4490,7 +4490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(Z
                        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 */
@@ -8513,7 +8513,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND
                        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 */
@@ -10388,7 +10388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMPVAR_HANDLER(
                        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 */
@@ -30186,7 +30186,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND
                        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 */
@@ -35494,7 +35494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OP
                        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 */
@@ -38225,7 +38225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMPVAR_HANDLER(ZEN
                        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 */
@@ -41298,7 +41298,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CONST_HANDLER(
                        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 */
@@ -43728,7 +43728,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_CV_HANDLER(ZEN
                        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 */
@@ -44891,7 +44891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MOD_SPEC_TMPVAR_TMPVAR_HANDLER
                        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 */