From 4d5d77904e9e4dc52236ec5416d1ddfef9b3911c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 10 Oct 2018 23:18:34 +0200 Subject: [PATCH] Fix foreach/get_object_vars for shadowed properties If we are in a scope where the shadowed private property is visible, the shadowing public property should not be visible. --- Zend/tests/foreach_shadowed_property.phpt | 28 +++++++++++++++++++++++ Zend/zend_object_handlers.c | 4 ++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/foreach_shadowed_property.phpt diff --git a/Zend/tests/foreach_shadowed_property.phpt b/Zend/tests/foreach_shadowed_property.phpt new file mode 100644 index 00000000000..7fb20141f42 --- /dev/null +++ b/Zend/tests/foreach_shadowed_property.phpt @@ -0,0 +1,28 @@ +--TEST-- +Foreach over object with shadowed private property +--FILE-- + $v) { + echo "$k => $v\n"; + } + var_dump(get_object_vars($this)); + } +} +class Test2 extends Test { + public $prop = "Test2"; +} + +(new Test2)->run(); + +?> +--EXPECT-- +prop => Test +array(1) { + ["prop"]=> + string(4) "Test" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 6773f997043..ccc4ebe7777 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -558,6 +558,7 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf } else { ZEND_ASSERT(property_info->flags & ZEND_ACC_PROTECTED); } + return SUCCESS; } else { property_info = zend_get_property_info(zobj->ce, prop_info_name, 1); if (property_info == NULL) { @@ -565,9 +566,8 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf } else if (property_info == ZEND_WRONG_PROPERTY_INFO) { return FAILURE; } - ZEND_ASSERT(property_info->flags & ZEND_ACC_PUBLIC); + return (property_info->flags & ZEND_ACC_PUBLIC) ? SUCCESS : FAILURE; } - return SUCCESS; } /* }}} */