Skip to content

Commit 81626fa

Browse files
committed
Fix constant propagation for JMP_NULL
Don't propagate to JMP_NULL because it doesn't consume OP1. Also don't propagate variables that were declared in other blocks. Fixes oss-fuzz #60736
1 parent 6e3c520 commit 81626fa

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

Zend/Optimizer/block_pass.c

+12-9
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,24 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
164164
MAKE_NOP(src);
165165
++(*opt_count);
166166
} else {
167-
zval c;
168-
ZVAL_COPY(&c, &ZEND_OP1_LITERAL(src));
169167
if (opline->opcode != ZEND_CASE
170168
&& opline->opcode != ZEND_CASE_STRICT
171169
&& opline->opcode != ZEND_FETCH_LIST_R
172170
&& opline->opcode != ZEND_SWITCH_LONG
173171
&& opline->opcode != ZEND_SWITCH_STRING
174172
&& opline->opcode != ZEND_MATCH
175-
&& zend_optimizer_update_op1_const(op_array, opline, &c)) {
176-
VAR_SOURCE(op1) = NULL;
177-
literal_dtor(&ZEND_OP1_LITERAL(src));
178-
MAKE_NOP(src);
179-
++(*opt_count);
180-
} else {
181-
zval_ptr_dtor_nogc(&c);
173+
&& opline->opcode != ZEND_JMP_NULL
174+
&& !zend_bitset_in(used_ext, VAR_NUM(op1.var))) {
175+
zval c;
176+
ZVAL_COPY(&c, &ZEND_OP1_LITERAL(src));
177+
if (zend_optimizer_update_op1_const(op_array, opline, &c)) {
178+
VAR_SOURCE(op1) = NULL;
179+
literal_dtor(&ZEND_OP1_LITERAL(src));
180+
MAKE_NOP(src);
181+
++(*opt_count);
182+
} else {
183+
zval_ptr_dtor_nogc(&c);
184+
}
182185
}
183186
}
184187
}

Zend/tests/oss_fuzz_60736.phpt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
--TEST--
2+
oss-fuzz #60736: Bad constant propagation in JMP_NULL
3+
--FILE--
4+
<?php
5+
(1?4:y)?->y;
6+
?>
7+
--EXPECTF--
8+
Warning: Attempt to read property "y" on int in %s on line %d

0 commit comments

Comments
 (0)