From 16f2ce8537e1f01f8badb42498a0f0d79b82a444 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 10 Aug 2015 17:47:47 +0800 Subject: [PATCH] Hmm, we should also take care of uninitialized hashTable --- Zend/zend_hash.c | 24 ++++++++++++++---------- Zend/zend_hash.h | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 0d3932ebd4..96ed6794f7 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -807,18 +807,22 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) } } -ZEND_API int ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t size) { +ZEND_API void ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t nSize) { void *old_data = HT_GET_DATA_ADDR(ht); - Bucket *old_buckets = ht->arData; + if (ht->u.flags & HASH_FLAG_INITIALIZED) { + Bucket *old_buckets = ht->arData; - HANDLE_BLOCK_INTERRUPTIONS(); - ht->nTableSize = zend_hash_check_size(size); - ht->nTableMask = -ht->nTableSize; - HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT)); - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); - pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); - zend_hash_rehash(ht); - HANDLE_UNBLOCK_INTERRUPTIONS(); + HANDLE_BLOCK_INTERRUPTIONS(); + ht->nTableSize = zend_hash_check_size(nSize); + ht->nTableMask = -ht->nTableSize; + HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT)); + memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); + pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); + zend_hash_rehash(ht); + HANDLE_UNBLOCK_INTERRUPTIONS(); + } else { + ht->nTableSize = zend_hash_check_size(nSize); + } } ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index b32309603c..ae7baa5cd0 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -212,7 +212,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_ #define zend_hash_next_free_element(ht) \ (ht)->nNextFreeElement -ZEND_API int ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t size); +ZEND_API void ZEND_FASTCALL zend_hash_resize(HashTable *ht, uint32_t nSize); ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht); ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source); -- 2.50.1