diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 30169921173b..bb79ca8a2669 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1164,7 +1164,7 @@ static void zend_jit_allocate_registers(zend_jit_ctx *ctx, const zend_op_array * if (range->start > op_num) { /* further blocks will not be relevant... */ break; - } else if (op_num < range->end && var_num == (range->var & ~ZEND_LIVE_MASK)) { + } else if (op_num < range->end && EX_NUM_TO_VAR(var_num) == (range->var & ~ZEND_LIVE_MASK)) { /* check if opcodes in range may throw */ do { if (zend_may_throw(op_array->opcodes + op_num, ssa->ops + op_num, op_array, ssa)) { diff --git a/ext/opcache/tests/jit/gh24988.phpt b/ext/opcache/tests/jit/gh24988.phpt new file mode 100644 index 000000000000..f8cd56e5bec1 --- /dev/null +++ b/ext/opcache/tests/jit/gh24988.phpt @@ -0,0 +1,47 @@ +--TEST-- +GH-24988 (JIT: crash in cleanup_live_vars when % by zero throws mid-expression) +--CREDITS-- +waroad +jorgsowa +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit_buffer_size=64M +opcache.jit=function +opcache.optimization_level=0 +--EXTENSIONS-- +opcache +--FILE-- +self()->self(); +} + +function deep(int $a, int $b, int $c) { + $a &= 255; + return ($a + 1) - ($b + $b + (($a + 1) % ($b % $c))); +} + +$o = new D; +var_dump(deep(15, 3, 7)); +pollute($o, 1, 2); +try { + deep(15, 3, 0); +} catch (DivisionByZeroError $e) { + echo $e->getMessage(), "\n"; +} +echo "end\n"; + +?> +--EXPECT-- +int(9) +Modulo by zero +end +dtor