diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 59dc162632..405c0bfbf3 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -4160,9 +4160,11 @@ void buf_set_changedtick(buf_T *const buf, const varnumber_T changedtick) buf->changedtick_di.di_tv.vval.v_number = changedtick; if (tv_dict_is_watched(buf->b_vars)) { + buf->b_locked++; tv_dict_watcher_notify(buf->b_vars, (char *)buf->changedtick_di.di_key, &buf->changedtick_di.di_tv, &old_val); + buf->b_locked--; } } diff --git a/test/functional/ex_cmds/dict_notifications_spec.lua b/test/functional/ex_cmds/dict_notifications_spec.lua index b6068a86db..e8fa305d99 100644 --- a/test/functional/ex_cmds/dict_notifications_spec.lua +++ b/test/functional/ex_cmds/dict_notifications_spec.lua @@ -428,6 +428,11 @@ describe('Vimscript dictionary notifications', function() command([[call dictwatcherdel(b:, 'changedtick', 'OnTickChanged')]]) insert('t') assert_alive() + + command([[call dictwatcheradd(b:, 'changedtick', {-> execute('bwipe!')})]]) + insert('t') + eq('E937: Attempt to delete a buffer that is in use: [No Name]', api.nvim_get_vvar('errmsg')) + assert_alive() end) it('does not cause use-after-free when unletting from callback', function()