@@ -7741,14 +7741,22 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
7741
7741
if (!func
7742
7742
&& trace
7743
7743
&& 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
7745
7750
func = (zend_function*)trace->func;
7751
+ #endif
7746
7752
}
7747
7753
7748
7754
#ifdef _WIN32
7749
7755
if (0) {
7750
7756
#else
7751
- if (func && func->type == ZEND_INTERNAL_FUNCTION) {
7757
+ if (opline->opcode == ZEND_INIT_FCALL
7758
+ && func
7759
+ && func->type == ZEND_INTERNAL_FUNCTION) {
7752
7760
#endif
7753
7761
/* load constant address later */
7754
7762
} 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
7762
7770
| jz >1
7763
7771
|.cold_code
7764
7772
|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)) {
7766
7777
| LOAD_ADDR FCARG1a, func
7767
7778
| EXT_CALL zend_jit_init_func_run_time_cache_helper, r0
7768
7779
| 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
7786
7797
| // CACHE_PTR(opline->result.num, fbc);
7787
7798
| mov r1, EX->run_time_cache
7788
7799
| mov aword [r1 + opline->result.num], r0
7789
- | test r0, r0
7790
- | jnz >3
7791
7800
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
+ }
7792
7832
| jmp &exit_addr
7793
7833
} else {
7834
+ | test r0, r0
7835
+ | jnz >3
7794
7836
| // SAVE_OPLINE();
7795
7837
| SAVE_VALID_OPLINE opline, r0
7796
7838
| jmp ->undefined_function
0 commit comments