@@ -1420,7 +1420,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
14201420 do {
14211421 zend_hash_iterators_update (ht , iter_pos , j );
14221422 iter_pos = zend_hash_iterators_lower_pos (ht , iter_pos + 1 );
1423- } while (iter_pos < i );
1423+ } while (iter_pos <= i );
14241424 }
14251425 q ++ ;
14261426 j ++ ;
@@ -2416,7 +2416,7 @@ static zend_always_inline uint32_t zend_array_dup_elements(const HashTable *sour
24162416 if (EXPECTED (!HT_HAS_ITERATORS (target ))) {
24172417 while (p != end ) {
24182418 if (zend_array_dup_element (source , target , target_idx , p , q , false, static_keys , with_holes )) {
2419- if (source -> nInternalPointer == idx ) {
2419+ if (UNEXPECTED ( target -> nInternalPointer > target_idx && target -> nInternalPointer <= idx ) ) {
24202420 target -> nInternalPointer = target_idx ;
24212421 }
24222422 target_idx ++ ; q ++ ;
@@ -2429,19 +2429,21 @@ static zend_always_inline uint32_t zend_array_dup_elements(const HashTable *sour
24292429
24302430 while (p != end ) {
24312431 if (zend_array_dup_element (source , target , target_idx , p , q , false, static_keys , with_holes )) {
2432- if (source -> nInternalPointer == idx ) {
2432+ if (UNEXPECTED ( target -> nInternalPointer > target_idx && target -> nInternalPointer <= idx ) ) {
24332433 target -> nInternalPointer = target_idx ;
24342434 }
24352435 if (UNEXPECTED (idx >= iter_pos )) {
24362436 do {
24372437 zend_hash_iterators_update (target , iter_pos , target_idx );
24382438 iter_pos = zend_hash_iterators_lower_pos (target , iter_pos + 1 );
2439- } while (iter_pos < idx );
2439+ } while (iter_pos <= idx );
24402440 }
24412441 target_idx ++ ; q ++ ;
24422442 }
24432443 idx ++ ; p ++ ;
24442444 }
2445+ /* Move past-the-end iterators so they can pick up newly appended elements. */
2446+ _zend_hash_iterators_update (target , source -> nNumUsed , target_idx );
24452447 }
24462448 return target_idx ;
24472449 }
0 commit comments