diff options
| author | Xinchen Hui <laruence@php.net> | 2015-08-23 11:40:49 +0800 |
|---|---|---|
| committer | Xinchen Hui <laruence@php.net> | 2015-08-23 11:42:33 +0800 |
| commit | 55f88141c5a308ae507ef23606b190387e6c37dc (patch) | |
| tree | 18067d0a3d1fbb546e578665d8b7d8c7c4d6bea0 /Zend/zend_execute.c | |
| parent | e26a04f9ecb18fe6d233fb5840f71ad216f27938 (diff) | |
| download | php-git-55f88141c5a308ae507ef23606b190387e6c37dc.tar.gz | |
Re-Fixed bug #70321 (Magic getter breaks reference to array property)
Diffstat (limited to 'Zend/zend_execute.c')
| -rw-r--r-- | Zend/zend_execute.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 59f936d2a3..76a2f21ce3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1721,6 +1721,8 @@ convert_to_array: zend_class_entry *ce = Z_OBJCE_P(container); zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ZSTR_VAL(ce->name)); } + } else if (UNEXPECTED(Z_REFCOUNT_P(retval) == 1)) { + ZVAL_UNREF(retval); } if (result != retval) { ZVAL_INDIRECT(result, retval); @@ -1925,6 +1927,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c (ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result)) != NULL) { if (ptr != result) { ZVAL_INDIRECT(result, ptr); + } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { + ZVAL_UNREF(ptr); } } else { zend_throw_error(NULL, "Cannot access undefined property for object with overloaded property access"); @@ -1937,6 +1941,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c zval *ptr = Z_OBJ_HT_P(container)->read_property(container, prop_ptr, type, cache_slot, result); if (ptr != result) { ZVAL_INDIRECT(result, ptr); + } else if (UNEXPECTED(Z_ISREF_P(ptr) && Z_REFCOUNT_P(ptr) == 1)) { + ZVAL_UNREF(ptr); } } else { zend_error(E_WARNING, "This object doesn't support property references"); |
