Skip to content

Commit 8f00430

Browse files
authored
Fix GH-15972: Assertion failure in ext/opcache/jit/zend_jit_vm_helpers.c with function JIT (#16001)
1 parent 07377de commit 8f00430

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

ext/opcache/jit/zend_jit_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_H
231231
void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D);
232232
bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D);
233233
void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D);
234+
void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC);
234235
void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D);
235236

236237
zend_constant* ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags);

ext/opcache/jit/zend_jit_ir.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3024,6 +3024,7 @@ static void zend_jit_setup_disasm(void)
30243024
REGISTER_HELPER(zend_jit_verify_return_slow);
30253025
REGISTER_HELPER(zend_jit_deprecated_helper);
30263026
REGISTER_HELPER(zend_jit_undefined_long_key);
3027+
REGISTER_HELPER(zend_jit_undefined_long_key_ex);
30273028
REGISTER_HELPER(zend_jit_undefined_string_key);
30283029
REGISTER_HELPER(zend_jit_copy_extra_args_helper);
30293030
REGISTER_HELPER(zend_jit_vm_stack_free_args_helper);
@@ -11716,6 +11717,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx *jit,
1171611717
if (!op2_loaded) {
1171711718
// JIT: hval = Z_LVAL_P(dim);
1171811719
h = jit_Z_LVAL(jit, op2_addr);
11720+
op2_loaded = 1;
1171911721
}
1172011722
if (packed_loaded) {
1172111723
ref = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(_zend_hash_index_find), ht_ref, h);
@@ -11765,6 +11767,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx *jit,
1176511767
if (!op2_loaded) {
1176611768
// JIT: hval = Z_LVAL_P(dim);
1176711769
h = jit_Z_LVAL(jit, op2_addr);
11770+
op2_loaded = 1;
1176811771
}
1176911772
if (packed_loaded) {
1177011773
ref = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(_zend_hash_index_find), ht_ref, h);
@@ -11808,7 +11811,19 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx *jit,
1180811811
// JIT: zend_error(E_WARNING,"Undefined array key " ZEND_LONG_FMT, hval);
1180911812
// JIT: retval = &EG(uninitialized_zval);
1181011813
jit_SET_EX_OPLINE(jit, opline);
11811-
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_FASTCALL_FUNC));
11814+
if (Z_MODE(op2_addr) == IS_REG) {
11815+
if (!op2_loaded) {
11816+
// JIT: hval = Z_LVAL_P(dim);
11817+
h = jit_Z_LVAL(jit, op2_addr);
11818+
}
11819+
if (GCC_GLOBAL_REGS) {
11820+
ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_long_key_ex), h);
11821+
} else {
11822+
ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_long_key_ex), h, jit_FP(jit));
11823+
}
11824+
} else {
11825+
ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_FASTCALL_FUNC));
11826+
}
1181211827
ir_END_list(*end_inputs);
1181311828
break;
1181411829
case BP_VAR_IS:

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,15 @@ void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D)
210210
ZVAL_NULL(result);
211211
}
212212

213+
void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC)
214+
{
215+
const zend_op *opline = EX(opline);
216+
zval *result = EX_VAR(opline->result.var);
217+
218+
zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, key);
219+
ZVAL_NULL(result);
220+
}
221+
213222
void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D)
214223
{
215224
const zend_op *opline = EX(opline);

ext/opcache/tests/jit/gh15972.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
GH-15972 (Assertion failure in ext/opcache/jit/zend_jit_vm_helpers.c with function JIT)
3+
--EXTENSIONS--
4+
opcache
5+
--FILE--
6+
<?php
7+
function test(){
8+
for($i = 0; $i < 2; $i++){
9+
$a = @[3][$i];
10+
}
11+
}
12+
test();
13+
?>
14+
DONE
15+
--EXPECT--
16+
DONE

0 commit comments

Comments
 (0)