Skip to content

Commit 77c9c8c

Browse files
committed
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: Fix GH-20890: Segfault in zval_undefined_cv with non-simple property hook with minimal tracing JIT
2 parents 0e003a1 + 57c62eb commit 77c9c8c

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ PHP NEWS
3131
. Fixed bug GH-20836 (Stack overflow in mb_convert_variables with
3232
recursive array references). (alexandre-daubois)
3333

34+
- Opcache:
35+
. Fixed bug GH-20890 (Segfault in zval_undefined_cv with non-simple
36+
property hook with minimal tracing JIT). (ndossche)
37+
3438
- Phar:
3539
. Fixed bug GH-20882 (buildFromIterator breaks with missing base directory).
3640
(ndossche)

ext/opcache/jit/zend_jit_trace.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,14 @@ static int zend_jit_trace_may_exit(const zend_op_array *op_array, const zend_op
330330
// TODO: recompilation may change target ???
331331
return 0;
332332
#endif
333+
case ZEND_FETCH_OBJ_R:
334+
if (opline->op2_type == IS_CONST) {
335+
const zend_class_entry *ce = opline->op1_type == IS_UNUSED ? op_array->scope : NULL;
336+
if (!ce || !(ce->ce_flags & ZEND_ACC_FINAL) || ce->num_hooked_props > 0) {
337+
return 1;
338+
}
339+
}
340+
break;
333341
case ZEND_RETURN_BY_REF:
334342
case ZEND_RETURN:
335343
/* 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)