summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2015-08-23 11:40:49 +0800
committerXinchen Hui <laruence@php.net>2015-08-23 11:42:33 +0800
commit55f88141c5a308ae507ef23606b190387e6c37dc (patch)
tree18067d0a3d1fbb546e578665d8b7d8c7c4d6bea0 /Zend/zend_execute.c
parente26a04f9ecb18fe6d233fb5840f71ad216f27938 (diff)
downloadphp-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.c6
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");