From 736b88c9b09e57a3b369b48a07fa2541b2571b4d Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 11 May 2023 00:25:21 +0200 Subject: [PATCH] Fix delayed early binding class redeclaration error If we bind the class to the runtime slot even if we're not the ones who have performed early binding we'll miss the redeclaration error in the ZEND_DECLARE_CLASS_DELAYED handler. --- .../tests/delayed_early_binding_redeclaration-1.inc | 2 ++ .../tests/delayed_early_binding_redeclaration-2.inc | 2 ++ Zend/tests/delayed_early_binding_redeclaration.phpt | 13 +++++++++++++ ext/opcache/zend_accelerator_util_funcs.c | 6 +++--- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/delayed_early_binding_redeclaration-1.inc create mode 100644 Zend/tests/delayed_early_binding_redeclaration-2.inc create mode 100644 Zend/tests/delayed_early_binding_redeclaration.phpt diff --git a/Zend/tests/delayed_early_binding_redeclaration-1.inc b/Zend/tests/delayed_early_binding_redeclaration-1.inc new file mode 100644 index 0000000000000..abfccf90686e3 --- /dev/null +++ b/Zend/tests/delayed_early_binding_redeclaration-1.inc @@ -0,0 +1,2 @@ + +--EXPECTF-- +Fatal error: Cannot declare class Bar, because the name is already in use in %sdelayed_early_binding_redeclaration-2.inc on line %d diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 9a64f92dab6ee..2ee60d4bbc493 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -358,9 +358,9 @@ static void zend_accel_do_delayed_early_binding( ce = zend_try_early_bind(orig_ce, parent_ce, early_binding->lcname, zv); } } - } - if (ce && early_binding->cache_slot != (uint32_t) -1) { - *(void**)((char*)run_time_cache + early_binding->cache_slot) = ce; + if (ce && early_binding->cache_slot != (uint32_t) -1) { + *(void**)((char*)run_time_cache + early_binding->cache_slot) = ce; + } } } CG(compiled_filename) = orig_compiled_filename;