summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2015-08-13 22:42:18 +0800
committerXinchen Hui <laruence@php.net>2015-08-13 22:42:18 +0800
commitded3a44cfdb5a1c52160f8f6993ea208811741f4 (patch)
treec5a75ac0769fe51532800fe7b0f4cd487fc2e525
parent69dbfa8e9f7a292880a639cad647d8ef8cf28a5c (diff)
downloadphp-git-ded3a44cfdb5a1c52160f8f6993ea208811741f4.tar.gz
Fixed segfault while OOM in pack_to_hash
-rw-r--r--Zend/zend_hash.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 89a5995683..7eaa64b1b4 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -191,14 +191,15 @@ ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed)
ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
{
- void *old_data = HT_GET_DATA_ADDR(ht);
+ void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
Bucket *old_buckets = ht->arData;
HT_ASSERT(GC_REFCOUNT(ht) == 1);
HANDLE_BLOCK_INTERRUPTIONS();
ht->u.flags &= ~HASH_FLAG_PACKED;
+ new_data = pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT);
ht->nTableMask = -ht->nTableSize;
- HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT));
+ HT_SET_DATA_ADDR(ht, new_data);
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
pefree(old_data, (ht)->u.flags & HASH_FLAG_PERSISTENT);
zend_hash_rehash(ht);