From: Nikita Popov Date: Wed, 4 Nov 2020 14:33:11 +0000 (+0100) Subject: Fix static variable in methods inheritance during preloading X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=670fe594b9cb838ddc78b7da0dc8aa55f3eebf3f;p=php Fix static variable in methods inheritance during preloading This is now "bug compatible" with the normal behavior, and more imporantly, does not crash :) --- diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index b0f4055be1..7401456d8f 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -90,13 +90,6 @@ static zend_function *zend_duplicate_user_function(zend_function *func) /* {{{ * new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); memcpy(new_function, func, sizeof(zend_op_array)); - if (ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr)) { - /* See: Zend/tests/method_static_var.phpt */ - new_function->op_array.static_variables = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr); - } - if (!(GC_FLAGS(new_function->op_array.static_variables) & IS_ARRAY_IMMUTABLE)) { - GC_ADDREF(new_function->op_array.static_variables); - } if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) { ZEND_ASSERT(new_function->op_array.fn_flags & ZEND_ACC_PRELOADED); @@ -105,6 +98,15 @@ static zend_function *zend_duplicate_user_function(zend_function *func) /* {{{ * ZEND_MAP_PTR_INIT(new_function->op_array.static_variables_ptr, &new_function->op_array.static_variables); } + HashTable *static_properties_ptr = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr); + if (static_properties_ptr) { + /* See: Zend/tests/method_static_var.phpt */ + ZEND_MAP_PTR_SET(new_function->op_array.static_variables_ptr, static_properties_ptr); + GC_TRY_ADDREF(static_properties_ptr); + } else { + GC_TRY_ADDREF(new_function->op_array.static_variables); + } + return new_function; } /* }}} */ diff --git a/ext/opcache/tests/preload_method_static_vars.inc b/ext/opcache/tests/preload_method_static_vars.inc new file mode 100644 index 0000000000..03d3c6cb6f --- /dev/null +++ b/ext/opcache/tests/preload_method_static_vars.inc @@ -0,0 +1,15 @@ + +--FILE-- + +--EXPECT-- +int(1) +int(2) +int(2) +int(3) + +int(1) +int(1)