Skip to content

Commit 0fff3cc

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix GH-22158: JIT observer dispatch through wrong run_time_cache slot
2 parents 5ce795b + 82cb37b commit 0fff3cc

4 files changed

Lines changed: 40 additions & 1 deletion

File tree

ext/opcache/jit/zend_jit_ir.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4708,7 +4708,7 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
47084708
ir_ref observer_handler_user = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_op_array_extension * sizeof(void *));
47094709

47104710
ir_MERGE_WITH(if_internal_func_end);
4711-
*observer_handler = ir_PHI_2(IR_ADDR, observer_handler_internal, observer_handler_user);
4711+
*observer_handler = ir_PHI_2(IR_ADDR, observer_handler_user, observer_handler_internal);
47124712
}
47134713

47144714
// JIT: if (*observer_handler == ZEND_OBSERVER_NONE_OBSERVED) {

ext/opcache/tests/jit/gh22158.phpt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
GH-22158 (Tracing JIT dispatches observer begin handler through the wrong run_time_cache slot on megamorphic calls)
3+
--EXTENSIONS--
4+
opcache
5+
zend_test
6+
--INI--
7+
opcache.enable=1
8+
opcache.enable_cli=1
9+
opcache.jit=tracing
10+
opcache.jit_buffer_size=32M
11+
opcache.jit_max_polymorphic_calls=0
12+
zend_test.observer.enabled=1
13+
zend_test.observer.observe_all=1
14+
zend_test.observer.show_output=0
15+
zend_test.observer.reserve_op_array_handle=1
16+
--FILE--
17+
<?php
18+
interface S { public function f(): int; }
19+
final class A implements S { public function f(): int { return 1; } }
20+
final class B implements S { public function f(): int { return 2; } }
21+
final class C implements S { public function f(): int { return 3; } }
22+
final class D implements S { public function f(): int { return 4; } }
23+
final class E implements S { public function f(): int { return 5; } }
24+
25+
$o = [new A, new B, new C, new D, new E];
26+
$t = 0;
27+
for ($i = 0; $i < 200000; $i++) {
28+
$t += $o[$i % 5]->f();
29+
}
30+
echo $t, "\n";
31+
?>
32+
--EXPECT--
33+
600000

ext/zend_test/observer.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "php_test.h"
1515
#include "observer.h"
1616
#include "zend_observer.h"
17+
#include "zend_extensions.h"
1718
#include "zend_smart_str.h"
1819
#include "ext/standard/php_var.h"
1920
#include "zend_generators.h"
@@ -398,6 +399,7 @@ PHP_INI_BEGIN()
398399
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals)
399400
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals)
400401
STD_PHP_INI_BOOLEAN("zend_test.observer.execute_internal", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_execute_internal, zend_zend_test_globals, zend_test_globals)
402+
STD_PHP_INI_BOOLEAN("zend_test.observer.reserve_op_array_handle", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_reserve_op_array_handle, zend_zend_test_globals, zend_test_globals)
401403
PHP_INI_END()
402404

403405
void zend_test_observer_init(INIT_FUNC_ARGS)
@@ -406,6 +408,9 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
406408
if (type != MODULE_TEMPORARY) {
407409
REGISTER_INI_ENTRIES();
408410
if (ZT_G(observer_enabled)) {
411+
if (ZT_G(observer_reserve_op_array_handle)) {
412+
zend_get_op_array_extension_handle("zend_test");
413+
}
409414
zend_observer_fcall_register(observer_fcall_init);
410415
}
411416
} else {

ext/zend_test/php_test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
4747
int observer_fiber_switch;
4848
int observer_fiber_destroy;
4949
int observer_execute_internal;
50+
int observer_reserve_op_array_handle;
5051
HashTable *global_weakmap;
5152
int replace_zend_execute_ex;
5253
int register_passes;

0 commit comments

Comments
 (0)