com php-src: Fixed memory leaks: Zend/zend_execute.c

From: Date: Thu, 26 May 2016 08:39:19 +0000
Subject: com php-src: Fixed memory leaks: Zend/zend_execute.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-95506@lists.php.net to get a copy of this message
Commit: b2cebf66275bf3ad5a98934a4b061a84c9448d3b Author: Dmitry Stogov <dmitry@zend.com> Thu, 26 May 2016 11:39:19 +0300 Parents: c304c6b761577aad02ea1555a43ffe2920fb16f8 Branches: typed_ref_properties Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=b2cebf66275bf3ad5a98934a4b061a84c9448d3b Log: Fixed memory leaks Changed paths: M Zend/zend_execute.c Diff: diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 81e2e98..a4a800a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1516,7 +1516,8 @@ 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, prev; + zval *z, obj; + zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1535,23 +1536,45 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, } ZVAL_COPY_VALUE(z, value); } + + if (EXPECTED(cache_slot)) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + } + + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, z); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (UNEXPECTED(result)) { + ZVAL_COPY(result, &z_copy); + } + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + OBJ_RELEASE(Z_OBJ(obj)); + zval_ptr_dtor(&z_copy); + return; + } + ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - ZVAL_COPY_VALUE(&prev, z); if (inc) { increment_function(z); } else { decrement_function(z); } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, z); - } Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - - if (UNEXPECTED(EG(exception))) { - ZVAL_COPY_VALUE(z, &prev); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); } - OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); } else { @@ -1565,8 +1588,9 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result) { zval *z; - zval rv, obj, prev; + zval rv, obj; zval *zptr; + zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1585,20 +1609,38 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z } ZVAL_COPY_VALUE(z, value); } + + if (EXPECTED(cache_slot)) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + } else { + prop_info = zend_get_property_info(Z_OBJCE(obj), Z_STR_P(property), 1); + } + + if (EXPECTED(prop_info) + && (UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) + && UNEXPECTED(prop_info->type)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, z); + binary_op(&z_copy, &z_copy, value); + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); + } + zval_ptr_dtor(&z_copy); + OBJ_RELEASE(Z_OBJ(obj)); + return; + } + zptr = z; ZVAL_DEREF(z); SEPARATE_ZVAL_NOREF(z); - - ZVAL_COPY_VALUE(&prev, z); binary_op(z, z, value); - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); if (UNEXPECTED(result)) { ZVAL_COPY(result, z); } - if (UNEXPECTED(EG(exception))) { - ZVAL_COPY_VALUE(z, &prev); - } zval_ptr_dtor(zptr); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); @@ -2105,7 +2147,7 @@ return_indirect: } else { prop_info = zend_get_property_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), 1); } - if (UNEXPECTED(prop_info) + if (EXPECTED(prop_info) && (prop_op_type == IS_CONST || UNEXPECTED(prop_info != ZEND_WRONG_PROPERTY_INFO)) && UNEXPECTED(prop_info->type)) {

« previous php.cvs (#95506) next »