From 670fe594b9cb838ddc78b7da0dc8aa55f3eebf3f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Nov 2020 15:33:11 +0100 Subject: [PATCH] Fix static variable in methods inheritance during preloading This is now "bug compatible" with the normal behavior, and more imporantly, does not crash :) --- Zend/zend_inheritance.c | 16 ++++++------ .../tests/preload_method_static_vars.inc | 15 +++++++++++ .../tests/preload_method_static_vars.phpt | 25 +++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 ext/opcache/tests/preload_method_static_vars.inc create mode 100644 ext/opcache/tests/preload_method_static_vars.phpt 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) -- 2.50.1