@@ -220,7 +220,7 @@ static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize
220
220
ht -> nNumUsed = 0 ;
221
221
ht -> nNumOfElements = 0 ;
222
222
ht -> nInternalPointer = 0 ;
223
- ht -> nNextFreeElement = 0 ;
223
+ ht -> nNextFreeElement = ZEND_LONG_MIN ;
224
224
ht -> pDestructor = pDestructor ;
225
225
ht -> nTableSize = zend_hash_check_size (nSize );
226
226
}
@@ -935,6 +935,10 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
935
935
IS_CONSISTENT (ht );
936
936
HT_ASSERT_RC1 (ht );
937
937
938
+ if (h == ZEND_LONG_MIN && (flag & HASH_ADD_NEXT )) {
939
+ h = 0 ;
940
+ }
941
+
938
942
if (HT_FLAGS (ht ) & HASH_FLAG_PACKED ) {
939
943
if (h < ht -> nNumUsed ) {
940
944
p = ht -> arData + h ;
@@ -998,8 +1002,8 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
998
1002
p = ht -> arData + idx ;
999
1003
Z_NEXT (p -> val ) = HT_HASH (ht , nIndex );
1000
1004
HT_HASH (ht , nIndex ) = HT_IDX_TO_HASH (idx );
1001
- if ((zend_long )h >= ( zend_long ) ht -> nNextFreeElement ) {
1002
- ht -> nNextFreeElement = h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX ;
1005
+ if ((zend_long )h >= ht -> nNextFreeElement ) {
1006
+ ht -> nNextFreeElement = ( zend_long ) h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX ;
1003
1007
}
1004
1008
add :
1005
1009
ht -> nNumOfElements ++ ;
@@ -1665,7 +1669,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht)
1665
1669
}
1666
1670
ht -> nNumUsed = 0 ;
1667
1671
ht -> nNumOfElements = 0 ;
1668
- ht -> nNextFreeElement = 0 ;
1672
+ ht -> nNextFreeElement = ZEND_LONG_MIN ;
1669
1673
ht -> nInternalPointer = 0 ;
1670
1674
}
1671
1675
@@ -1704,7 +1708,7 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht)
1704
1708
}
1705
1709
ht -> nNumUsed = 0 ;
1706
1710
ht -> nNumOfElements = 0 ;
1707
- ht -> nNextFreeElement = 0 ;
1711
+ ht -> nNextFreeElement = ZEND_LONG_MIN ;
1708
1712
ht -> nInternalPointer = 0 ;
1709
1713
}
1710
1714
@@ -2018,7 +2022,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
2018
2022
target -> nTableMask = HT_MIN_MASK ;
2019
2023
target -> nNumUsed = 0 ;
2020
2024
target -> nNumOfElements = 0 ;
2021
- target -> nNextFreeElement = 0 ;
2025
+ target -> nNextFreeElement = ZEND_LONG_MIN ;
2022
2026
target -> nInternalPointer = 0 ;
2023
2027
target -> nTableSize = HT_MIN_SIZE ;
2024
2028
HT_SET_DATA_ADDR (target , & uninitialized_bucket );
0 commit comments