]> granicus.if.org Git - php/commitdiff
Fixed memory leak while add_mem faile
authorXinchen Hui <laruence@gmail.com>
Sat, 15 Mar 2014 11:33:36 +0000 (19:33 +0800)
committerXinchen Hui <laruence@gmail.com>
Sat, 15 Mar 2014 11:33:36 +0000 (19:33 +0800)
Zend/zend_hash.h

index a8f4977f075a611e8b6adc3521ee946fd9e498f1..5942611955aa881faa42e83003d87bcf2cafc673 100644 (file)
@@ -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)