mirror of
https://github.com/neovim/neovim.git
synced 2025-10-03 08:28:34 +00:00
Test and initial fix for crash with dictwatcherdel
Fixes https://github.com/neovim/neovim/issues/11188.
This commit is contained in:

committed by
Jan Edmund Lazo

parent
c20ae3aadb
commit
4c76b1e981
@@ -1109,6 +1109,7 @@ void tv_dict_watcher_add(dict_T *const dict, const char *const key_pattern,
|
||||
watcher->key_pattern_len = key_pattern_len;
|
||||
watcher->callback = callback;
|
||||
watcher->busy = false;
|
||||
watcher->needs_free = false;
|
||||
QUEUE_INSERT_TAIL(&dict->watchers, &watcher->node);
|
||||
}
|
||||
|
||||
@@ -1197,7 +1198,11 @@ bool tv_dict_watcher_remove(dict_T *const dict, const char *const key_pattern,
|
||||
}
|
||||
|
||||
QUEUE_REMOVE(w);
|
||||
tv_dict_watcher_free(watcher);
|
||||
if (watcher->busy) {
|
||||
watcher->needs_free = true;
|
||||
} else {
|
||||
tv_dict_watcher_free(watcher);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1268,6 +1273,9 @@ void tv_dict_watcher_notify(dict_T *const dict, const char *const key,
|
||||
callback_call(&watcher->callback, 3, argv, &rettv);
|
||||
watcher->busy = false;
|
||||
tv_clear(&rettv);
|
||||
if (watcher->needs_free) {
|
||||
tv_dict_watcher_free(watcher);
|
||||
}
|
||||
}
|
||||
}
|
||||
tv_dict_unref(dict);
|
||||
|
@@ -89,6 +89,7 @@ typedef struct dict_watcher {
|
||||
size_t key_pattern_len;
|
||||
QUEUE node;
|
||||
bool busy; // prevent recursion if the dict is changed in the callback
|
||||
bool needs_free;
|
||||
} DictWatcher;
|
||||
|
||||
/// Bool variable values
|
||||
|
Reference in New Issue
Block a user