Skip to content

Commit cf12da4

Browse files
committed
Fixed similar issues(segfault on OOM)
1 parent ded3a44 commit cf12da4

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

Zend/zend_hash.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
197197
HT_ASSERT(GC_REFCOUNT(ht) == 1);
198198
HANDLE_BLOCK_INTERRUPTIONS();
199199
ht->u.flags &= ~HASH_FLAG_PACKED;
200-
new_data = pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT);
200+
new_data = pemalloc(HT_DATA_SIZE_EX(ht->nTableSize) + HT_HASH_SIZE_EX(-ht->nTableSize), (ht)->u.flags & HASH_FLAG_PERSISTENT);
201201
ht->nTableMask = -ht->nTableSize;
202202
HT_SET_DATA_ADDR(ht, new_data);
203203
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
@@ -208,14 +208,15 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht)
208208

209209
ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht)
210210
{
211-
void *old_data = HT_GET_DATA_ADDR(ht);
211+
void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
212212
Bucket *old_buckets = ht->arData;
213213

214214
HT_ASSERT(GC_REFCOUNT(ht) == 1);
215215
HANDLE_BLOCK_INTERRUPTIONS();
216+
new_data = pemalloc(HT_DATA_SIZE_EX(ht->nTableSize) + HT_HASH_SIZE_EX(HT_MIN_MASK), (ht)->u.flags & HASH_FLAG_PERSISTENT);
216217
ht->u.flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
217218
ht->nTableMask = HT_MIN_MASK;
218-
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), (ht)->u.flags & HASH_FLAG_PERSISTENT));
219+
HT_SET_DATA_ADDR(ht, new_data);
219220
HT_HASH_RESET_PACKED(ht);
220221
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
221222
pefree(old_data, (ht)->u.flags & HASH_FLAG_PERSISTENT);
@@ -2198,12 +2199,13 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
21982199
}
21992200
} else {
22002201
if (renumber) {
2201-
void *old_data = HT_GET_DATA_ADDR(ht);
2202+
void *new_data, *old_data = HT_GET_DATA_ADDR(ht);
22022203
Bucket *old_buckets = ht->arData;
22032204

2205+
new_data = pemalloc(HT_DATA_SIZE_EX(ht->nTableSize) + HT_HASH_SIZE_EX(HT_MIN_MASK), ht->u.flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT);
22042206
ht->u.flags |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS;
22052207
ht->nTableMask = HT_MIN_MASK;
2206-
HT_SET_DATA_ADDR(ht, pemalloc(HT_SIZE(ht), ht->u.flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT));
2208+
HT_SET_DATA_ADDR(ht, new_data);
22072209
memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed);
22082210
pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT & HASH_FLAG_PERSISTENT);
22092211
HT_HASH_RESET_PACKED(ht);

0 commit comments

Comments
 (0)