summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2004-02-11 16:28:46 +0000
committerZeev Suraski <zeev@php.net>2004-02-11 16:28:46 +0000
commit3d4c7922e1d090ca141fe3ffae5592f6a02d9394 (patch)
treea1bbe6c679cf61317e11466c8e7c72a93d56a184
parentb625b034938be92e121d46f75d5c781e473aa4b4 (diff)
downloadphp-git-3d4c7922e1d090ca141fe3ffae5592f6a02d9394.tar.gz
Fix leak with overloaded objects, when they're used just "for the hell
of it" :)
-rw-r--r--Zend/zend_execute.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 4fbc2d1ac0..62bb45f4f9 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -78,7 +78,9 @@ static inline void zend_clean_garbage(TSRMLS_D)
#define PZVAL_UNLOCK(z) zend_pzval_unlock_func(z TSRMLS_CC)
#define PZVAL_LOCK(z) zend_pzval_lock_func(z)
-#define SELECTIVE_PZVAL_LOCK(pzv, pzn) if (!((pzn)->u.EA.type & EXT_TYPE_UNUSED)) { PZVAL_LOCK(pzv); }
+#define RETURN_VALUE_UNUSED(pzn) (((pzn)->u.EA.type & EXT_TYPE_UNUSED))
+#define SELECTIVE_PZVAL_LOCK(pzv, pzn) if (!RETURN_VALUE_UNUSED(pzn)) { PZVAL_LOCK(pzv); }
+
/* End of zend_execute_locks.h */
@@ -1091,10 +1093,15 @@ static void zend_fetch_property_address_read(znode *result, znode *op1, znode *o
zval_dtor(offset);
}
FREE_OP(Ts, op2, EG(free_op2));
+
+ if (RETURN_VALUE_UNUSED(result) && ((*retval)->refcount == 0)) {
+ zval_dtor(*retval);
+ FREE_ZVAL(*retval);
+ return; /* no need for locking */
+ }
}
SELECTIVE_PZVAL_LOCK(*retval, result);
- return;
}
static void zend_pre_incdec_property(znode *result, znode *op1, znode *op2, temp_variable * Ts, int (*incdec_op)(zval *) TSRMLS_DC)