Fix invalid target opline with jit->reuse_ip active (#16457)

This is an alternative for #16440
This commit is contained in:
Dmitry Stogov 2024-10-18 12:48:23 +03:00 committed by GitHub
parent 55266d420b
commit 8b5668efef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 47 additions and 0 deletions

View file

@ -8794,6 +8794,14 @@ jit_SET_EX_OPLINE(jit, opline);
delayed_call_chain = 1;
}
if (trace
&& trace->op == ZEND_JIT_TRACE_END
&& trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
if (!zend_jit_set_ip(jit, opline + 1)) {
return 0;
}
}
return 1;
}
@ -9057,6 +9065,14 @@ static int zend_jit_init_method_call(zend_jit_ctx *jit,
jit->delayed_call_level = call_level;
}
if (trace
&& trace->op == ZEND_JIT_TRACE_END
&& trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
if (!zend_jit_set_ip(jit, opline + 1)) {
return 0;
}
}
return 1;
}

View file

@ -0,0 +1,31 @@
--TEST--
JIT INIT_FCALL: 004 Invalid target opline with jit->reuse_ip active
--INI--
opcache.enable=1
opcache.enable_cli=1
--EXTENSIONS--
opcache
--FILE--
<?php
function gen() {
yield 1;
yield 2;
return 3;
};
opcache_jit_blacklist(gen(...));
for ($i = 0; $i < 2; ++$i) {
foreach (gen() as $val) {
var_dump($val);
}
}
?>
DONE
--EXPECT--
int(1)
int(2)
int(1)
int(2)
DONE