diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-06-24 11:19:17 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-06-24 11:19:17 +0200 |
commit | cbce0cbacbbe264878a2eedf945460929b9a2b72 (patch) | |
tree | 0fbdde0f1e63d7c1967622a554884fff1c2c962e /ext/reflection | |
parent | 59c4c8297bd02b9148b5111e3d5af838027c8f93 (diff) | |
parent | 26aefb750a614391cdb8ee3f63d66f46ed57bd55 (diff) | |
download | php-git-cbce0cbacbbe264878a2eedf945460929b9a2b72.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fix #69804: ::getStaticPropertyValue() throws on protected props
Diffstat (limited to 'ext/reflection')
-rw-r--r-- | ext/reflection/php_reflection.c | 14 | ||||
-rw-r--r-- | ext/reflection/tests/006.phpt | 24 | ||||
-rw-r--r-- | ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt | 36 | ||||
-rw-r--r-- | ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt | 44 |
4 files changed, 81 insertions, 37 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 2208b76aa9..8f0e22dd04 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3933,7 +3933,7 @@ ZEND_METHOD(ReflectionClass, getStaticProperties) ZEND_METHOD(ReflectionClass, getStaticPropertyValue) { reflection_object *intern; - zend_class_entry *ce; + zend_class_entry *ce, *old_scope; zend_string *name; zval *prop, *def_value = NULL; @@ -3946,7 +3946,12 @@ ZEND_METHOD(ReflectionClass, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } + + old_scope = EG(fake_scope); + EG(fake_scope) = ce; prop = zend_std_get_static_property(ce, name, BP_VAR_IS); + EG(fake_scope) = old_scope; + if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3966,7 +3971,7 @@ ZEND_METHOD(ReflectionClass, getStaticPropertyValue) ZEND_METHOD(ReflectionClass, setStaticPropertyValue) { reflection_object *intern; - zend_class_entry *ce; + zend_class_entry *ce, *old_scope; zend_property_info *prop_info; zend_string *name; zval *variable_ptr, *value; @@ -3980,7 +3985,10 @@ ZEND_METHOD(ReflectionClass, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); + old_scope = EG(fake_scope); + EG(fake_scope) = ce; + variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); + EG(fake_scope) = old_scope; if (!variable_ptr) { zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, diff --git a/ext/reflection/tests/006.phpt b/ext/reflection/tests/006.phpt index c21aa5af8b..2b03f3e694 100644 --- a/ext/reflection/tests/006.phpt +++ b/ext/reflection/tests/006.phpt @@ -86,15 +86,27 @@ TestDerived::testing(); string(3) "pub" string(3) "pub" string(7) "updated" -EXCEPTION -EXCEPTION +string(3) "pro" +string(3) "pro" +string(7) "updated" +string(3) "pri" +string(3) "pri" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" +string(7) "updated" string(7) "updated" string(7) "updated" string(7) "updated" -EXCEPTION -EXCEPTION string(7) "updated" string(7) "updated" string(7) "updated" -EXCEPTION -EXCEPTION diff --git a/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt b/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt index b11d2ec0d7..2b4cd27a94 100644 --- a/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt +++ b/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt @@ -19,41 +19,47 @@ class B extends A { echo "Retrieving static values from A:\n"; $rcA = new ReflectionClass('A'); -var_dump($rcA->getStaticPropertyValue("privateOverridden", "default value")); -var_dump($rcA->getStaticPropertyValue("\0A\0privateOverridden")); -var_dump($rcA->getStaticPropertyValue("protectedOverridden", "default value")); -var_dump($rcA->getStaticPropertyValue("\0*\0protectedOverridden")); +var_dump($rcA->getStaticPropertyValue("privateDoesNotExist", "default value")); +var_dump($rcA->getStaticPropertyValue("privateOverridden")); +var_dump($rcA->getStaticPropertyValue("protectedDoesNotExist", "default value")); +var_dump($rcA->getStaticPropertyValue("protectedOverridden")); var_dump($rcA->getStaticPropertyValue("publicOverridden")); echo "\nRetrieving static values from B:\n"; $rcB = new ReflectionClass('B'); -var_dump($rcB->getStaticPropertyValue("\0A\0privateOverridden")); -var_dump($rcB->getStaticPropertyValue("\0B\0privateOverridden")); -var_dump($rcB->getStaticPropertyValue("\0*\0protectedOverridden")); +var_dump($rcB->getStaticPropertyValue("privateOverridden")); +var_dump($rcB->getStaticPropertyValue("protectedOverridden")); var_dump($rcB->getStaticPropertyValue("publicOverridden")); echo "\nRetrieving non-existent values from A with no default value:\n"; try { - var_dump($rcA->getStaticPropertyValue("protectedOverridden")); + var_dump($rcA->getStaticPropertyValue("protectedDoesNotExist")); echo "you should not see this"; } catch (Exception $e) { echo $e->getMessage() . "\n"; } try { - var_dump($rcA->getStaticPropertyValue("privateOverridden")); + var_dump($rcA->getStaticPropertyValue("privateDoesNotExist")); echo "you should not see this"; } catch (Exception $e) { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- +--EXPECT-- Retrieving static values from A: string(13) "default value" +string(16) "original private" +string(13) "default value" +string(18) "original protected" +string(15) "original public" + +Retrieving static values from B: +string(15) "changed private" +string(17) "changed protected" +string(14) "changed public" -Fatal error: Uncaught ReflectionException: Class A does not have a property named in %s:%d -Stack trace: -#0 %s(%d): ReflectionClass->getStaticPropertyValue('\x00A\x00privateOverr...') -#1 {main} - thrown in %s on line %d +Retrieving non-existent values from A with no default value: +Class A does not have a property named protectedDoesNotExist +Class A does not have a property named privateDoesNotExist diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt index f51f4136b1..1414cfadb7 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt @@ -19,41 +19,59 @@ class B extends A { echo "Set static values in A:\n"; $rcA = new ReflectionClass('A'); -$rcA->setStaticPropertyValue("\0A\0privateOverridden", "new value 1"); -$rcA->setStaticPropertyValue("\0*\0protectedOverridden", "new value 2"); +$rcA->setStaticPropertyValue("privateOverridden", "new value 1"); +$rcA->setStaticPropertyValue("protectedOverridden", "new value 2"); $rcA->setStaticPropertyValue("publicOverridden", "new value 3"); print_r($rcA->getStaticProperties()); echo "\nSet static values in B:\n"; $rcB = new ReflectionClass('B'); -$rcB->setStaticPropertyValue("\0A\0privateOverridden", "new value 4"); -$rcB->setStaticPropertyValue("\0B\0privateOverridden", "new value 5"); -$rcB->setStaticPropertyValue("\0*\0protectedOverridden", "new value 6"); +$rcB->setStaticPropertyValue("privateOverridden", "new value 4"); +$rcB->setStaticPropertyValue("privateOverridden", "new value 5"); +$rcB->setStaticPropertyValue("protectedOverridden", "new value 6"); $rcB->setStaticPropertyValue("publicOverridden", "new value 7"); print_r($rcA->getStaticProperties()); print_r($rcB->getStaticProperties()); echo "\nSet non-existent values from A with no default value:\n"; try { - var_dump($rcA->setStaticPropertyValue("protectedOverridden", "new value 8")); + var_dump($rcA->setStaticPropertyValue("protectedDoesNotExist", "new value 8")); echo "you should not see this"; } catch (Exception $e) { echo $e->getMessage() . "\n"; } try { - var_dump($rcA->setStaticPropertyValue("privateOverridden", "new value 9")); + var_dump($rcA->setStaticPropertyValue("privateDoesNotExist", "new value 9")); echo "you should not see this"; } catch (Exception $e) { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- +--EXPECT-- Set static values in A: +Array +( + [privateOverridden] => new value 1 + [protectedOverridden] => new value 2 + [publicOverridden] => new value 3 +) -Fatal error: Uncaught ReflectionException: Class A does not have a property named in %s:%d -Stack trace: -#0 %s(%d): ReflectionClass->setStaticPropertyValue('\x00A\x00privateOverr...', 'new value 1') -#1 {main} - thrown in %s on line %d +Set static values in B: +Array +( + [privateOverridden] => new value 1 + [protectedOverridden] => new value 2 + [publicOverridden] => new value 3 +) +Array +( + [privateOverridden] => new value 5 + [protectedOverridden] => new value 6 + [publicOverridden] => new value 7 +) + +Set non-existent values from A with no default value: +Class A does not have a property named protectedDoesNotExist +Class A does not have a property named privateDoesNotExist |