Skip to content

Commit 4b8171e

Browse files
committed
Add tracing JIT guards for INTI_FCALL_BY_NAME and INIT_NS_FCALL_BY_NAME
1 parent d12b4c3 commit 4b8171e

File tree

1 file changed

+47
-5
lines changed

1 file changed

+47
-5
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7741,14 +7741,22 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
77417741
if (!func
77427742
&& trace
77437743
&& trace->op == ZEND_JIT_TRACE_INIT_CALL) {
7744-
/* TODO: add guard ??? */
7744+
#ifdef _WIN32
7745+
/* ASLR */
7746+
if (trace->func->type != ZEND_INTERNAL_FUNCTION) {
7747+
func = (zend_function*)trace->func;
7748+
}
7749+
#else
77457750
func = (zend_function*)trace->func;
7751+
#endif
77467752
}
77477753

77487754
#ifdef _WIN32
77497755
if (0) {
77507756
#else
7751-
if (func && func->type == ZEND_INTERNAL_FUNCTION) {
7757+
if (opline->opcode == ZEND_INIT_FCALL
7758+
&& func
7759+
&& func->type == ZEND_INTERNAL_FUNCTION) {
77527760
#endif
77537761
/* load constant address later */
77547762
} else if (func && op_array == &func->op_array) {
@@ -7762,7 +7770,10 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
77627770
| jz >1
77637771
|.cold_code
77647772
|1:
7765-
if (func && func->type == ZEND_USER_FUNCTION && (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)) {
7773+
if (opline->opcode == ZEND_INIT_FCALL
7774+
&& func
7775+
&& func->type == ZEND_USER_FUNCTION
7776+
&& (func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)) {
77667777
| LOAD_ADDR FCARG1a, func
77677778
| EXT_CALL zend_jit_init_func_run_time_cache_helper, r0
77687779
| mov r1, EX->run_time_cache
@@ -7786,11 +7797,42 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
77867797
| // CACHE_PTR(opline->result.num, fbc);
77877798
| mov r1, EX->run_time_cache
77887799
| mov aword [r1 + opline->result.num], r0
7789-
| test r0, r0
7790-
| jnz >3
77917800
if (zend_jit_trigger == ZEND_JIT_ON_HOT_TRACE) {
7801+
if (!func || opline->opcode == ZEND_INIT_FCALL) {
7802+
| test r0, r0
7803+
| jnz >3
7804+
} else if (func->type == ZEND_USER_FUNCTION
7805+
&& !(func->common.fn_flags & ZEND_ACC_IMMUTABLE)) {
7806+
const zend_op *opcodes = func->op_array.opcodes;
7807+
7808+
| .if X64
7809+
|| if (!IS_SIGNED_32BIT(opcodes)) {
7810+
| mov64 r1, ((ptrdiff_t)opcodes)
7811+
| cmp aword [r0 + offsetof(zend_op_array, opcodes)], r1
7812+
|| } else {
7813+
| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes
7814+
|| }
7815+
| .else
7816+
| cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes
7817+
| .endif
7818+
| jz >3
7819+
} else {
7820+
| .if X64
7821+
|| if (!IS_SIGNED_32BIT(func)) {
7822+
| mov64 r1, ((ptrdiff_t)func)
7823+
| cmp r0, r1
7824+
|| } else {
7825+
| cmp r0, func
7826+
|| }
7827+
| .else
7828+
| cmp r0, func
7829+
| .endif
7830+
| jz >3
7831+
}
77927832
| jmp &exit_addr
77937833
} else {
7834+
| test r0, r0
7835+
| jnz >3
77947836
| // SAVE_OPLINE();
77957837
| SAVE_VALID_OPLINE opline, r0
77967838
| jmp ->undefined_function

0 commit comments

Comments
 (0)