]> granicus.if.org Git - php/commitdiff
Avoid dangerous optimization
authorDmitry Stogov <dmitry@zend.com>
Mon, 6 Jul 2015 13:52:38 +0000 (16:52 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 6 Jul 2015 13:52:38 +0000 (16:52 +0300)
ext/opcache/Optimizer/block_pass.c

index ee9bda6094cdc4a853c73428786e8777086f54cd..e1e07ea01b69a4d4908e4294caa643c048f738a6 100644 (file)
@@ -762,7 +762,8 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
          */
                if (opline->opcode == ZEND_IS_EQUAL ||
                        opline->opcode == ZEND_IS_NOT_EQUAL ||
-                       opline->opcode == ZEND_CASE) {
+                       /* CASE variable will be deleted later by FREE, so we can't optimize it */
+                       (opline->opcode == ZEND_CASE && (ZEND_OP1_TYPE(opline) & (IS_CONST|IS_CV)))) {
                        if (ZEND_OP1_TYPE(opline) == IS_CONST &&
                                (Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_FALSE ||
                                 Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_TRUE)) {