summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-04-15 16:28:48 +0200
committerNikita Popov <nikic@php.net>2016-04-16 09:58:57 +0200
commitc0d8dc5bd701aad68692f91334a46c1fa46a6d1e (patch)
treed9c6bcf58923c186abdfad3865d1e94baf3c2415 /ext/standard/array.c
parent7e01c518b6a504846f397b787ab285105531d562 (diff)
downloadphp-git-c0d8dc5bd701aad68692f91334a46c1fa46a6d1e.tar.gz
Fixed bug #72031
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index a0cdd91d85..6f01198aef 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -3523,9 +3523,15 @@ static inline zval *array_column_fetch_prop(zval *data, zval *name, zval *rv)
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, has_property)(data, name, 1, 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)
+ || 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);
}
+
zend_string_release(key);
} else if (Z_TYPE_P(data) == IS_ARRAY) {
if (Z_TYPE_P(name) == IS_STRING) {