@@ -1168,8 +1168,9 @@ int phpdbg_print_changed_zvals(void) {
1168
1168
1169
1169
if (zend_hash_num_elements (PHPDBG_G (watchlist_mem )) > 0 ) {
1170
1170
/* we must not add elements to the hashtable while iterating over it (resize => read into freed memory) */
1171
- mem_list = PHPDBG_G (watchlist_mem );
1172
- PHPDBG_G (watchlist_mem ) = PHPDBG_G (watchlist_mem_backup );
1171
+ mem_list = malloc (phpdbg_pagesize > sizeof (HashTable ) ? phpdbg_pagesize : sizeof (HashTable ));
1172
+ zend_hash_init (mem_list , zend_hash_num_elements (PHPDBG_G (watchlist_mem )), NULL , NULL , false);
1173
+ zend_hash_copy (mem_list , PHPDBG_G (watchlist_mem ), (copy_ctor_func_t ) zval_add_ref );
1173
1174
1174
1175
ZEND_HASH_MAP_FOREACH_NUM_KEY (mem_list , page ) {
1175
1176
phpdbg_btree_position pos = phpdbg_btree_find_between (& PHPDBG_G (watchpoint_tree ), page , page + phpdbg_pagesize );
@@ -1192,7 +1193,13 @@ int phpdbg_print_changed_zvals(void) {
1192
1193
phpdbg_reenable_memory_watches ();
1193
1194
1194
1195
if (mem_list ) {
1195
- PHPDBG_G (watchlist_mem ) = mem_list ;
1196
+ zend_hash_destroy (PHPDBG_G (watchlist_mem ));
1197
+ free (PHPDBG_G (watchlist_mem ));
1198
+ PHPDBG_G (watchlist_mem ) = malloc (phpdbg_pagesize > sizeof (HashTable ) ? phpdbg_pagesize : sizeof (HashTable ));
1199
+ zend_hash_init (PHPDBG_G (watchlist_mem ), phpdbg_pagesize / (sizeof (Bucket ) + sizeof (uint32_t )), NULL , NULL , true);
1200
+ zend_hash_copy (PHPDBG_G (watchlist_mem ), mem_list , (copy_ctor_func_t ) zval_add_ref );
1201
+ zend_hash_destroy (mem_list );
1202
+ free (mem_list );
1196
1203
phpdbg_reenable_memory_watches ();
1197
1204
}
1198
1205
0 commit comments