Skip to content

Commit d325163

Browse files
committed
Tracing JIT: Fixed incorrect assumption about in-memeory zval type
1 parent c7e974f commit d325163

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4564,6 +4564,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
45644564
op2_info = OP2_INFO();
45654565
CHECK_OP2_TRACE_TYPE();
45664566
op1_info = OP1_INFO();
4567+
if (ssa->vars[ssa_op->op1_use].no_val) {
4568+
if ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) == MAY_BE_LONG
4569+
|| (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_GUARD)) == MAY_BE_DOUBLE) {
4570+
if (STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var)) != IS_LONG
4571+
&& STACK_MEM_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var)) != IS_DOUBLE) {
4572+
/* type may be not set */
4573+
op1_info |= MAY_BE_NULL;
4574+
}
4575+
}
4576+
}
45674577
CHECK_OP1_TRACE_TYPE();
45684578
op1_def_info = OP1_DEF_INFO();
45694579
op1_addr = OP1_REG_ADDR();
@@ -5887,7 +5897,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
58875897
type = STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var));
58885898
}
58895899
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op1.var), type,
5890-
(type == IS_UNKNOWN || !ra || !ra[ssa_op->op1_def]));
5900+
(type == IS_UNKNOWN || !ra ||
5901+
(!ra[ssa_op->op1_def] && !ssa->vars[ssa_op->op1_def].no_val)));
58915902
if (type != IS_UNKNOWN) {
58925903
ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD;
58935904
if (ra && ra[ssa_op->op1_def]) {
@@ -5930,7 +5941,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
59305941
type = STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var));
59315942
}
59325943
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), type,
5933-
(type == IS_UNKNOWN || !ra || !ra[ssa_op->op2_def]));
5944+
(type == IS_UNKNOWN || !ra ||
5945+
(!ra[ssa_op->op2_def] && !ssa->vars[ssa_op->op2_def].no_val)));
59345946
if (type != IS_UNKNOWN) {
59355947
ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD;
59365948
if (ra && ra[ssa_op->op2_def]) {

ext/opcache/tests/jit/assign_045.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
JIT ASSIGN: incorrect assumption about in-memeory zval type
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
function test($x, $y) {
12+
$a = $b = $a = $y;
13+
var_dump($a + $x);
14+
}
15+
test(null, 1);
16+
?>
17+
--EXPECT--
18+
int(1)
19+

0 commit comments

Comments
 (0)