Skip to content

Commit 5e7a1c4

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 5e7a1c4

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

Zend/Optimizer/block_pass.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,16 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
172172
&& opline->opcode != ZEND_SWITCH_LONG
173173
&& opline->opcode != ZEND_SWITCH_STRING
174174
&& 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);
175+
&& opline->opcode != ZEND_JMP_NULL
176+
&& !zend_bitset_in(used_ext, VAR_NUM(op1.var))) {
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

Lines changed: 8 additions & 0 deletions
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)