From 350af549a0a6743046c63cc7136f27ddfff6301f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 17 Jun 2024 09:37:44 +0300 Subject: [PATCH] Fix GH-14475: PHP 8.3.7 with JIT encounters infinite loop on specific paths (#14558) --- ext/opcache/jit/zend_jit_trace.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index ec63ea38c25e5..ccf018493e780 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -8308,7 +8308,20 @@ int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf if (!(ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags & (ZEND_JIT_TRACE_JITED|ZEND_JIT_TRACE_BLACKLISTED))) { /* skip: not JIT-ed nor blacklisted */ } else if (ZEND_JIT_TRACE_NUM >= JIT_G(max_root_traces)) { - /* skip: too many root traces */ + /* too many root traces, blacklist the root trace */ + if (!(ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_BLACKLISTED)) { + SHM_UNPROTECT(); + zend_jit_unprotect(); + + ((zend_op*)opline)->handler = + ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->orig_handler; + + ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags &= ~ZEND_JIT_TRACE_JITED; + ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags |= ZEND_JIT_TRACE_BLACKLISTED; + + zend_jit_protect(); + SHM_PROTECT(); + } } else { SHM_UNPROTECT(); zend_jit_unprotect();