Skip to content

Commit 1e4095f

Browse files
committed
Fixed bug #81256 (Assertion `zv != ((void *)0)' failed for "preload" with JIT)
1 parent 2378f35 commit 1e4095f

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ PHP NEWS
1111
(Dmitry)
1212
. Fixed bug #81249 (Intermittent property assignment failure with JIT
1313
enabled). (Dmitry)
14+
. Fixed bug #81256 (Assertion `zv != ((void *)0)' failed for "preload" with
15+
JIT). (Dmitry)
1416

1517
- Reflection:
1618
. Fixed bug #80097 (ReflectionAttribute is not a Reflector). (beberlei)

ext/opcache/ZendAccelerator.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4086,6 +4086,7 @@ static void preload_link(void)
40864086
zend_op_array *op_array = &script->script.main_op_array;
40874087
zend_op *opline = op_array->opcodes;
40884088
zend_op *end = opline + op_array->last;
4089+
uint32_t skip_dynamic_func_count = 0;
40894090

40904091
while (opline != end) {
40914092
switch (opline->opcode) {
@@ -4096,6 +4097,40 @@ static void preload_link(void)
40964097
MAKE_NOP(opline);
40974098
}
40984099
break;
4100+
case ZEND_DECLARE_FUNCTION:
4101+
opline->op2.num -= skip_dynamic_func_count;
4102+
key = Z_STR_P(RT_CONSTANT(opline, opline->op1));
4103+
zv = zend_hash_find(EG(function_table), key);
4104+
if (zv && Z_PTR_P(zv) == op_array->dynamic_func_defs[opline->op2.num]) {
4105+
zend_op_array **dynamic_func_defs;
4106+
4107+
op_array->num_dynamic_func_defs--;
4108+
if (op_array->num_dynamic_func_defs == 0) {
4109+
dynamic_func_defs = NULL;
4110+
} else {
4111+
dynamic_func_defs = emalloc(sizeof(zend_op_array*) * op_array->num_dynamic_func_defs);
4112+
if (opline->op2.num > 0) {
4113+
memcpy(
4114+
dynamic_func_defs,
4115+
op_array->dynamic_func_defs,
4116+
sizeof(zend_op_array*) * opline->op2.num);
4117+
}
4118+
if (op_array->num_dynamic_func_defs - opline->op2.num > 0) {
4119+
memcpy(
4120+
dynamic_func_defs + opline->op2.num,
4121+
op_array->dynamic_func_defs + (opline->op2.num + 1),
4122+
sizeof(zend_op_array*) * (op_array->num_dynamic_func_defs - opline->op2.num));
4123+
}
4124+
}
4125+
efree(op_array->dynamic_func_defs);
4126+
op_array->dynamic_func_defs = dynamic_func_defs;
4127+
skip_dynamic_func_count++;
4128+
MAKE_NOP(opline);
4129+
}
4130+
break;
4131+
case ZEND_DECLARE_LAMBDA_FUNCTION:
4132+
opline->op2.num -= skip_dynamic_func_count;
4133+
break;
40994134
}
41004135
opline++;
41014136
}

ext/opcache/tests/jit/bug81256.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Bug #81256: Assertion `zv != ((void *)0)' failed for "preload" with JIT
3+
--EXTENSIONS--
4+
opcache
5+
--INI--
6+
opcache.enable=1
7+
opcache.enable_cli=1
8+
opcache.jit_buffer_size=1M
9+
opcache.jit=function
10+
opcache.preload={PWD}/preload_bug81256.inc
11+
--FILE--
12+
<?php
13+
foo();
14+
?>
15+
--EXPECT--
16+
Hello
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
$a = true;
3+
if ($a) {
4+
function foo(...$arg) {
5+
echo "Hello\n";
6+
}
7+
}

0 commit comments

Comments
 (0)