Skip to content

Commit c8952c7

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix GH-20890: Segfault in zval_undefined_cv with non-simple property hook with minimal tracing JIT
2 parents 51a3798 + 77c9c8c commit c8952c7

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,14 @@ static int zend_jit_trace_may_exit(const zend_op_array *op_array, const zend_op
345345
// TODO: recompilation may change target ???
346346
return 0;
347347
#endif
348+
case ZEND_FETCH_OBJ_R:
349+
if (opline->op2_type == IS_CONST) {
350+
const zend_class_entry *ce = opline->op1_type == IS_UNUSED ? op_array->scope : NULL;
351+
if (!ce || !(ce->ce_flags & ZEND_ACC_FINAL) || ce->num_hooked_props > 0) {
352+
return 1;
353+
}
354+
}
355+
break;
348356
case ZEND_RETURN_BY_REF:
349357
case ZEND_RETURN:
350358
/* return */

ext/opcache/tests/jit/gh20890.phpt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
GH-20890 (Segfault in zval_undefined_cv with non-simple property hook with minimal tracing JIT)
3+
--CREDITS--
4+
Moonster8282
5+
--EXTENSIONS--
6+
opcache
7+
--INI--
8+
opcache.jit=1251
9+
--FILE--
10+
<?php
11+
class HookJIT {
12+
private int $readCount = 0;
13+
14+
public int $computed {
15+
get {
16+
$this->readCount++;
17+
return $this->readCount * 2;
18+
}
19+
}
20+
}
21+
22+
function hook_hot_path($obj, $iterations) {
23+
$sum = 0;
24+
for ($i = 0; $i < $iterations; $i++) {
25+
$sum += $obj->computed;
26+
}
27+
return $sum;
28+
}
29+
30+
echo "Testing property hook in hot path...\n";
31+
$obj = new HookJIT();
32+
$result = hook_hot_path($obj, 100);
33+
echo "Result: $result\n";
34+
?>
35+
--EXPECT--
36+
Testing property hook in hot path...
37+
Result: 10100

0 commit comments

Comments
 (0)