Skip to content

Commit 9fc0eab

Browse files
committed
Fixed incorrect QM_ASSIGN elimination
Fixes OSS Fuzz #60735
1 parent af77d3b commit 9fc0eab

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

Zend/Optimizer/block_pass.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,10 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
174174
&& opline->opcode != ZEND_MATCH
175175
&& zend_optimizer_update_op1_const(op_array, opline, &c)) {
176176
VAR_SOURCE(op1) = NULL;
177-
literal_dtor(&ZEND_OP1_LITERAL(src));
178-
MAKE_NOP(src);
177+
if (!zend_bitset_in(used_ext, VAR_NUM(src->result.var))) {
178+
literal_dtor(&ZEND_OP1_LITERAL(src));
179+
MAKE_NOP(src);
180+
}
179181
++(*opt_count);
180182
} else {
181183
zval_ptr_dtor_nogc(&c);
@@ -197,8 +199,10 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
197199
ZVAL_COPY(&c, &ZEND_OP1_LITERAL(src));
198200
if (zend_optimizer_update_op2_const(op_array, opline, &c)) {
199201
VAR_SOURCE(op2) = NULL;
200-
literal_dtor(&ZEND_OP1_LITERAL(src));
201-
MAKE_NOP(src);
202+
if (!zend_bitset_in(used_ext, VAR_NUM(src->result.var))) {
203+
literal_dtor(&ZEND_OP1_LITERAL(src));
204+
MAKE_NOP(src);
205+
}
202206
++(*opt_count);
203207
} else {
204208
zval_ptr_dtor_nogc(&c);
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Block Pass 004: Inorrect QM_ASSIGN elimination
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--EXTENSIONS--
8+
opcache
9+
--FILE--
10+
<?php
11+
(1?4:y)?->y;
12+
?>
13+
DONE
14+
--EXPECTF--
15+
Warning: Attempt to read property "y" on int in %sblock_pass_004.php on line 2
16+
DONE

0 commit comments

Comments
 (0)