diff options
author | Dmitry Stogov <dmitry@zend.com> | 2016-11-22 11:22:10 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2016-11-22 11:22:10 +0300 |
commit | 63ea4d194bab4401a7de3f1706d156d64cf137f3 (patch) | |
tree | 4bd3288003ff0fd7e80c93bca498f063a85f5008 | |
parent | 0da08fe5952afa6039015d51d6646515bde0b972 (diff) | |
download | php-git-63ea4d194bab4401a7de3f1706d156d64cf137f3.tar.gz |
Fixed memory leak (Bob)
-rw-r--r-- | Zend/zend_execute.c | 6 | ||||
-rw-r--r-- | tests/lang/operators/overloaded_property_ref.phpt | 20 |
2 files changed, 23 insertions, 3 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 326c719c65..dc3db0f9fe 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1412,11 +1412,11 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval rv; if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { - zval *z, obj; + zval *z, *zptr, obj; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); - z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv); + zptr = z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv); if (UNEXPECTED(EG(exception))) { OBJ_RELEASE(Z_OBJ(obj)); return; @@ -1443,7 +1443,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(z); + zval_ptr_dtor(zptr); } else { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); if (UNEXPECTED(result)) { diff --git a/tests/lang/operators/overloaded_property_ref.phpt b/tests/lang/operators/overloaded_property_ref.phpt new file mode 100644 index 0000000000..7561fc9916 --- /dev/null +++ b/tests/lang/operators/overloaded_property_ref.phpt @@ -0,0 +1,20 @@ +--TEST-- +Operators on overlaoded property reference +--FILE-- +<?php +class C { + function __construct() { $this->bar = str_repeat("1", 2); } + function &__get($x) { return $this->bar; } + function __set($x, $v) { $this->bar = $v; } +} +$x = new C; +var_dump(++$x->foo); +$x = new C; +var_dump($x->foo++); +$x = new C; +var_dump($x->foo += 2); +?> +--EXPECT-- +int(12) +string(2) "11" +int(13) |