From: Xinchen Hui Date: Sat, 15 Mar 2014 11:33:36 +0000 (+0800) Subject: Fixed memory leak while add_mem faile X-Git-Tag: POST_PHPNG_MERGE~412^2~315 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c201896125e484c7dc0fb725262958ba224fa59f;p=php Fixed memory leak while add_mem faile --- diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index a8f4977f07..5942611955 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -343,20 +343,28 @@ static inline void *zend_hash_str_update_ptr(HashTable *ht, const char *str, int static inline void *zend_hash_add_mem(HashTable *ht, zend_string *key, void *pData, size_t size) { - void *p; + void *p, *r; p = pemalloc(size, ht->flags & HASH_FLAG_PERSISTENT); memcpy(p, pData, size); - return zend_hash_add_ptr(ht, key, p); + if ((r = zend_hash_add_ptr(ht, key, p))) { + return r; + } + pefree(p, ht->flags & HASH_FLAG_PERSISTENT); + return NULL; } static inline void *zend_hash_str_add_mem(HashTable *ht, const char *str, int len, void *pData, size_t size) { - void *p; + void *p, *r; p = pemalloc(size, ht->flags & HASH_FLAG_PERSISTENT); memcpy(p, pData, size); - return zend_hash_str_add_ptr(ht, str, len, p); + if ((r = zend_hash_str_add_ptr(ht, str, len, p))) { + return r; + } + pefree(p, ht->flags & HASH_FLAG_PERSISTENT); + return NULL; } static inline void *zend_hash_update_mem(HashTable *ht, zend_string *key, void *pData, size_t size) @@ -406,11 +414,15 @@ static inline void *zend_hash_index_update_mem(HashTable *ht, ulong h, void *pDa static inline void *zend_hash_next_index_insert_mem(HashTable *ht, void *pData, size_t size) { - void *p; + void *p, *r; p = pemalloc(size, ht->flags & HASH_FLAG_PERSISTENT); memcpy(p, pData, size); - return zend_hash_next_index_insert_ptr(ht, p); + if ((r = zend_hash_next_index_insert_ptr(ht, p))) { + return r; + } + pefree(p, ht->flags & HASH_FLAG_PERSISTENT); + return NULL; } static inline void *zend_hash_find_ptr(const HashTable *ht, zend_string *key)