Hmm, we should also take care of uninitialized hashTable
authorXinchen Hui <laruence@php.net>
Mon, 10 Aug 2015 09:47:47 +0000 (17:47 +0800)
committerXinchen Hui <laruence@php.net>
Mon, 10 Aug 2015 09:58:24 +0000 (17:58 +0800)
Zend/zend_hash.c
Zend/zend_hash.h

index 0d3932ebd420a96e234394817105ab5616c1417c..96ed6794f7ff91bbb83eb9c958c01f00b9082e61 100644 (file)
@@ -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)
index b32309603c96bd72d78afab3091c5f36a0d7971e..ae7baa5cd01c59d48b5e7df5a6cbf01be248075c 100644 (file)
@@ -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);