Skip to content

Commit 9fb49aa

Browse files
zeertzjqgithub-actions[bot]
authored andcommitted
fix(buffer): don't allow changedtick watcher to delete buffer (#36764)
(cherry picked from commit 14d65da)
1 parent fcd0517 commit 9fb49aa

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

src/nvim/buffer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4160,9 +4160,11 @@ void buf_set_changedtick(buf_T *const buf, const varnumber_T changedtick)
41604160
buf->changedtick_di.di_tv.vval.v_number = changedtick;
41614161

41624162
if (tv_dict_is_watched(buf->b_vars)) {
4163+
buf->b_locked++;
41634164
tv_dict_watcher_notify(buf->b_vars,
41644165
(char *)buf->changedtick_di.di_key,
41654166
&buf->changedtick_di.di_tv,
41664167
&old_val);
4168+
buf->b_locked--;
41674169
}
41684170
}

test/functional/ex_cmds/dict_notifications_spec.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,11 @@ describe('Vimscript dictionary notifications', function()
428428
command([[call dictwatcherdel(b:, 'changedtick', 'OnTickChanged')]])
429429
insert('t')
430430
assert_alive()
431+
432+
command([[call dictwatcheradd(b:, 'changedtick', {-> execute('bwipe!')})]])
433+
insert('t')
434+
eq('E937: Attempt to delete a buffer that is in use: [No Name]', api.nvim_get_vvar('errmsg'))
435+
assert_alive()
431436
end)
432437

433438
it('does not cause use-after-free when unletting from callback', function()

0 commit comments

Comments
 (0)