diff options
author | Nikita Popov <nikic@php.net> | 2016-04-15 16:28:48 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2016-04-16 09:58:57 +0200 |
commit | c0d8dc5bd701aad68692f91334a46c1fa46a6d1e (patch) | |
tree | d9c6bcf58923c186abdfad3865d1e94baf3c2415 /ext/standard/array.c | |
parent | 7e01c518b6a504846f397b787ab285105531d562 (diff) | |
download | php-git-c0d8dc5bd701aad68692f91334a46c1fa46a6d1e.tar.gz |
Fixed bug #72031
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 8 |
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) { |