summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-04-16 09:52:22 +0200
committerNikita Popov <nikic@php.net>2016-04-16 09:59:01 +0200
commit28801bf249f113b6a25e43688fabcebb67a22df5 (patch)
tree3d4482994a7171d1af2bf1dcf1ea2fe70273063d /ext/standard/array.c
parentc0d8dc5bd701aad68692f91334a46c1fa46a6d1e (diff)
downloadphp-git-28801bf249f113b6a25e43688fabcebb67a22df5.tar.gz
Respect property visibility in array_column
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 6f01198aef..61723e584f 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -3521,18 +3521,17 @@ static inline zval *array_column_fetch_prop(zval *data, zval *name, zval *rv)
zval *prop = NULL;
if (Z_TYPE_P(data) == IS_OBJECT) {
- zend_string *key = zval_get_string(name);
+ if (!Z_OBJ_HANDLER_P(data, has_property) || !Z_OBJ_HANDLER_P(data, read_property)) {
+ return NULL;
+ }
/* The has_property check is first performed in "exists" mode (which returns true for
* properties that are null but exist) and then in "has" mode to handle objects that
* implement __isset (which is not called in "exists" mode). */
- if (!Z_OBJ_HANDLER_P(data, has_property)
- || Z_OBJ_HANDLER_P(data, has_property)(data, name, 2, NULL)
+ if (Z_OBJ_HANDLER_P(data, has_property)(data, name, 2, NULL)
|| Z_OBJ_HANDLER_P(data, has_property)(data, name, 0, NULL)) {
- prop = zend_read_property(Z_OBJCE_P(data), data, ZSTR_VAL(key), ZSTR_LEN(key), 1, rv);
+ prop = Z_OBJ_HANDLER_P(data, read_property)(data, name, BP_VAR_R, NULL, rv);
}
-
- zend_string_release(key);
} else if (Z_TYPE_P(data) == IS_ARRAY) {
if (Z_TYPE_P(name) == IS_STRING) {
prop = zend_hash_find(Z_ARRVAL_P(data), Z_STR_P(name));