com php-src: Hmm, we should also take care of uninitialized hashTable: Zend/zend_hash.c Zend/zend_hash.h
| From: | Anatol Belski | Date: | Mon, 10 Aug 2015 09:58:24 +0000 |
| Subject: | com php-src: Hmm, we should also take care of uninitialized hashTable: Zend/zend_hash.c Zend/zend_hash.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-88630@lists.php.net to get a copy of this message | ||
Commit: 16f2ce8537e1f01f8badb42498a0f0d79b82a444
Author: Xinchen Hui <laruence@php.net> Mon, 10 Aug 2015 17:47:47 +0800
Parents: aa546256e3f3ddf609f5f64ab977650a45652442
Branches: PHP-7.0.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=16f2ce8537e1f01f8badb42498a0f0d79b82a444
Log:
Hmm, we should also take care of uninitialized hashTable
Changed paths:
M Zend/zend_hash.c
M Zend/zend_hash.h
Diff:
diff --git a/Zend/zend_hash.c b/Zend/zend_hash..c
index 0d3932e..96ed679 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 b323096..ae7baa5 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);