From 3b115e6e9b13cb1872cc7547aba11bf06793f5fc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 13 Nov 2024 12:51:21 +0300 Subject: [PATCH] Fix zend_jit_class_may_be_modified() fon non linked classes --- ext/opcache/jit/zend_jit.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 40ca50d970a..9db35932b7f 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -708,10 +708,15 @@ static bool zend_jit_class_may_be_modified(const zend_class_entry *ce, const zen return 0; } if (ce->info.user.filename == called_from->filename) { - if (ce->parent && zend_jit_class_may_be_modified(ce->parent, called_from)) { + if (ce->parent + && (!(ce->ce_flags & ZEND_ACC_LINKED) + || zend_jit_class_may_be_modified(ce->parent, called_from))) { return 1; } if (ce->num_interfaces) { + if (!(ce->ce_flags & ZEND_ACC_LINKED)) { + return 1; + } for (i = 0; i < ce->num_interfaces; i++) { if (zend_jit_class_may_be_modified(ce->interfaces[i], called_from)) { return 1; @@ -719,10 +724,14 @@ static bool zend_jit_class_may_be_modified(const zend_class_entry *ce, const zen } } if (ce->num_traits) { + if (!(ce->ce_flags & ZEND_ACC_LINKED)) { + return 1; + } for (i=0; i < ce->num_traits; i++) { zend_class_entry *trait = zend_fetch_class_by_name(ce->trait_names[i].name, - ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT); - if (zend_jit_class_may_be_modified(trait, called_from)) { + ce->trait_names[i].lc_name, + ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT); + if (!trait || zend_jit_class_may_be_modified(trait, called_from)) { return 1; } }