summaryrefslogtreecommitdiff
path: root/ext/reflection
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-06-24 11:19:17 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2020-06-24 11:19:17 +0200
commitcbce0cbacbbe264878a2eedf945460929b9a2b72 (patch)
tree0fbdde0f1e63d7c1967622a554884fff1c2c962e /ext/reflection
parent59c4c8297bd02b9148b5111e3d5af838027c8f93 (diff)
parent26aefb750a614391cdb8ee3f63d66f46ed57bd55 (diff)
downloadphp-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.c14
-rw-r--r--ext/reflection/tests/006.phpt24
-rw-r--r--ext/reflection/tests/ReflectionClass_getStaticPropertyValue_001.phpt36
-rw-r--r--ext/reflection/tests/ReflectionClass_setStaticPropertyValue_001.phpt44
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