mirror of
https://github.com/php/php-src.git
synced 2025-08-18 06:58:55 +02:00
Prevent HashTable compaction below HT_MIN_SIZE (this may lead to hash collisions).
This commit is contained in:
parent
9c35f87e9a
commit
a2f8a7675b
2 changed files with 18 additions and 14 deletions
|
@ -94,13 +94,15 @@ static void zend_hash_persist(HashTable *ht, zend_persist_func_t pPersistElement
|
||||||
/* compact table */
|
/* compact table */
|
||||||
void *old_data = HT_GET_DATA_ADDR(ht);
|
void *old_data = HT_GET_DATA_ADDR(ht);
|
||||||
Bucket *old_buckets = ht->arData;
|
Bucket *old_buckets = ht->arData;
|
||||||
int32_t hash_size = -(int32_t)ht->nTableMask;
|
int32_t hash_size;
|
||||||
|
|
||||||
|
if (ht->nNumUsed <= HT_MIN_SIZE) {
|
||||||
|
hash_size = HT_MIN_SIZE;
|
||||||
|
} else {
|
||||||
|
hash_size = -(int32_t)ht->nTableMask;
|
||||||
while (hash_size >> 1 > ht->nNumUsed) {
|
while (hash_size >> 1 > ht->nNumUsed) {
|
||||||
hash_size >>= 1;
|
hash_size >>= 1;
|
||||||
}
|
}
|
||||||
if (hash_size < -HT_MIN_MASK) {
|
|
||||||
hash_size = -HT_MIN_MASK;
|
|
||||||
}
|
}
|
||||||
ht->nTableMask = -hash_size;
|
ht->nTableMask = -hash_size;
|
||||||
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
|
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
|
||||||
|
@ -174,13 +176,15 @@ static void zend_hash_persist_immutable(HashTable *ht)
|
||||||
/* compact table */
|
/* compact table */
|
||||||
void *old_data = HT_GET_DATA_ADDR(ht);
|
void *old_data = HT_GET_DATA_ADDR(ht);
|
||||||
Bucket *old_buckets = ht->arData;
|
Bucket *old_buckets = ht->arData;
|
||||||
int32_t hash_size = -(int32_t)ht->nTableMask;
|
int32_t hash_size;
|
||||||
|
|
||||||
|
if (ht->nNumUsed <= HT_MIN_SIZE) {
|
||||||
|
hash_size = HT_MIN_SIZE;
|
||||||
|
} else {
|
||||||
|
hash_size = -(int32_t)ht->nTableMask;
|
||||||
while (hash_size >> 1 > ht->nNumUsed) {
|
while (hash_size >> 1 > ht->nNumUsed) {
|
||||||
hash_size >>= 1;
|
hash_size >>= 1;
|
||||||
}
|
}
|
||||||
if (hash_size < -HT_MIN_MASK) {
|
|
||||||
hash_size = -HT_MIN_MASK;
|
|
||||||
}
|
}
|
||||||
ht->nTableMask = -hash_size;
|
ht->nTableMask = -hash_size;
|
||||||
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
|
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
|
||||||
|
|
|
@ -65,8 +65,8 @@ static void zend_hash_persist_calc(HashTable *ht, void (*pPersistElement)(zval *
|
||||||
while (hash_size >> 1 > ht->nNumUsed) {
|
while (hash_size >> 1 > ht->nNumUsed) {
|
||||||
hash_size >>= 1;
|
hash_size >>= 1;
|
||||||
}
|
}
|
||||||
if (hash_size < -HT_MIN_MASK) {
|
if (hash_size < HT_MIN_SIZE) {
|
||||||
hash_size = -HT_MIN_MASK;
|
hash_size = HT_MIN_SIZE;
|
||||||
}
|
}
|
||||||
ADD_SIZE(hash_size * sizeof(uint32_t) + ht->nNumUsed * sizeof(Bucket));
|
ADD_SIZE(hash_size * sizeof(uint32_t) + ht->nNumUsed * sizeof(Bucket));
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue