From 625dba022c69dc499ecab39801d90baa9fbb2120 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Jun 2015 11:35:12 +0300 Subject: [PATCH] Don't evaluate invalid constant expressions. --- ext/opcache/Optimizer/block_pass.c | 12 ++++++++---- ext/opcache/Optimizer/pass1_5.c | 9 ++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 8694b4b61a..8b85422d2f 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -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); } diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 611b39df24..ec6cf15c7f 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -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; -- 2.40.0