From 65ba36a7b4aced89a9fa804706acbe22f757702d Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 16 Oct 2024 18:58:42 +0200 Subject: [PATCH] Disallow asymmetric visibility on static properties This check was forgotten in the original implementation. Relaxing this restriction shouldn't be hard, but needs some work. We either need to prevent merging of cache slots for R/RW/W, or we need to introduce an additional check when writing to the property indirectly. This check is currently present only for direct writes. --- Zend/tests/asymmetric_visibility/static_props.phpt | 12 ++++++++++++ Zend/zend_compile.c | 4 ++++ 2 files changed, 16 insertions(+) create mode 100644 Zend/tests/asymmetric_visibility/static_props.phpt diff --git a/Zend/tests/asymmetric_visibility/static_props.phpt b/Zend/tests/asymmetric_visibility/static_props.phpt new file mode 100644 index 0000000000000..65fd3aa1923d2 --- /dev/null +++ b/Zend/tests/asymmetric_visibility/static_props.phpt @@ -0,0 +1,12 @@ +--TEST-- +Asymmetric visibility on static props +--FILE-- + +--EXPECTF-- +Fatal error: Static property may not have asymmetric visibility in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 99938df0c8f09..ae50c29dffad6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8598,6 +8598,10 @@ static void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t f zend_error_noreturn(E_COMPILE_ERROR, "Property cannot be both final and private"); } + if ((flags & ZEND_ACC_STATIC) && (flags & ZEND_ACC_PPP_SET_MASK)) { + zend_error_noreturn(E_COMPILE_ERROR, "Static property may not have asymmetric visibility"); + } + if (ce->ce_flags & ZEND_ACC_INTERFACE) { if (flags & ZEND_ACC_FINAL) { zend_error_noreturn(E_COMPILE_ERROR, "Property in interface cannot be final");