]> granicus.if.org Git - php/commitdiff
Don't evaluate invalid constant expressions.
authorDmitry Stogov <dmitry@zend.com>
Mon, 29 Jun 2015 08:35:12 +0000 (11:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 29 Jun 2015 08:35:12 +0000 (11:35 +0300)
ext/opcache/Optimizer/block_pass.c
ext/opcache/Optimizer/pass1_5.c

index 8694b4b61aacdca31ba79e0044415b4faf558017..8b85422d2fff8e5d6ed95d45253748abe74718e2 100644 (file)
@@ -988,10 +988,14 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
                        int er;
 
             if ((opline->opcode == ZEND_DIV || opline->opcode == ZEND_MOD) &&
-                ((Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_LONG &&
-                  Z_LVAL(ZEND_OP2_LITERAL(opline)) == 0) ||
-                 (Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_DOUBLE &&
-                  Z_DVAL(ZEND_OP2_LITERAL(opline)) == 0.0))) {
+                zval_get_long(&ZEND_OP2_LITERAL(opline)) == 0) {
+                               if (RESULT_USED(opline)) {
+                                       SET_VAR_SOURCE(opline);
+                               }
+                opline++;
+                               continue;
+            } else if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR) &&
+                zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
                                if (RESULT_USED(opline)) {
                                        SET_VAR_SOURCE(opline);
                                }
index 611b39df2420e21d97c1a822fe04c6745200c96f..ec6cf15c7f6798bf32dfe548dd04f202b144a214 100644 (file)
@@ -74,11 +74,14 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
                                zval result;
                                int er;
 
-                               if (opline->opcode == ZEND_DIV &&
-                                       Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_LONG &&
-                                       Z_LVAL(ZEND_OP2_LITERAL(opline)) == 0) {
+                               if ((opline->opcode == ZEND_DIV || opline->opcode == ZEND_MOD) &&
+                                       zval_get_long(&ZEND_OP2_LITERAL(opline)) == 0) {
                                        /* div by 0 */
                                        break;
+                               } else if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR) &&
+                                       zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
+                                       /* shift by negative number */
+                                       break;
                                }
                                er = EG(error_reporting);
                                EG(error_reporting) = 0;