com php-src: Don't evaluate invalid constant expressions.: ext/opcache/Optimizer/block_pass.c ext/opcache/Optimizer/ pass1_5.c
| From: | Dmitry Stogov | Date: | Mon, 29 Jun 2015 08:35:12 +0000 |
| Subject: | com php-src: Don't evaluate invalid constant expressions.: ext/opcache/Optimizer/block_pass.c ext/opcache/Optimizer/ pass1_5.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-87608@lists.php.net to get a copy of this message | ||
Commit: 625dba022c69dc499ecab39801d90baa9fbb2120
Author: Dmitry Stogov <dmitry@zend.com> Mon, 29 Jun 2015 11:35:12 +0300
Parents: 5060060317b0fd8c8d806c81e673b37ffb830159
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=625dba022c69dc499ecab39801d90baa9fbb2120
Log:
Don't evaluate invalid constant expressions.
Changed paths:
M ext/opcache/Optimizer/block_pass.c
M ext/opcache/Optimizer/pass1_5.c
Diff:
diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c
index 8694b4b..8b85422 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 611b39d..ec6cf15 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;