From 05e3fa0f682dc295e872e007b25150c7c19c148d Mon Sep 17 00:00:00 2001 From: Gabriel Caruso Date: Sun, 26 Apr 2020 04:31:47 +0200 Subject: [PATCH] Check `__set_state` structure Fix Bug #79521. --- Zend/tests/magic_methods_set_state.phpt | 14 ++++++++++++++ Zend/zend_compile.c | 2 ++ .../tests/ReflectionMethod_getModifiers_basic.phpt | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/magic_methods_set_state.phpt diff --git a/Zend/tests/magic_methods_set_state.phpt b/Zend/tests/magic_methods_set_state.phpt new file mode 100644 index 0000000000000..389798e54291d --- /dev/null +++ b/Zend/tests/magic_methods_set_state.phpt @@ -0,0 +1,14 @@ +--TEST-- +Testing __set_state() declaration with wrong modifier +--FILE-- + +--EXPECTF-- +Warning: The magic method Foo::__set_state() must be static in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7c84456a6ff9c..0923aa71415cd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6170,6 +6170,8 @@ zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_check_magic_method_attr(fn_flags, ce, "__serialize", 0); } else if (zend_string_equals_literal(lcname, "__unserialize")) { zend_check_magic_method_attr(fn_flags, ce, "__unserialize", 0); + } else if (zend_string_equals_literal(lcname, "__set_state")) { + zend_check_magic_method_attr(fn_flags, ce, "__set_state", 1); } return lcname; diff --git a/ext/reflection/tests/ReflectionMethod_getModifiers_basic.phpt b/ext/reflection/tests/ReflectionMethod_getModifiers_basic.phpt index 70038c31a088d..e5e967e28e82a 100644 --- a/ext/reflection/tests/ReflectionMethod_getModifiers_basic.phpt +++ b/ext/reflection/tests/ReflectionMethod_getModifiers_basic.phpt @@ -52,7 +52,7 @@ class TestClass public function __wakeup() {} - public function __set_state() {} + public static function __set_state() {} public function __autoload() {} } @@ -143,7 +143,7 @@ Modifiers for method TestClass::__wakeup(): Modifiers for method TestClass::__set_state(): -0x00000001 +0x00000011 Modifiers for method TestClass::__autoload(): @@ -207,7 +207,7 @@ Modifiers for method TestClass::__wakeup(): Modifiers for method TestClass::__set_state(): -0x00000001 +0x00000011 Modifiers for method TestClass::__autoload():