diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-12-08 09:25:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-08 09:25:43 +0800 |
commit | fe1e2eff062605f7e617885011160a678822fd0c (patch) | |
tree | 995ffe7aebd06a035d4315b868e35782c95b4aa4 | |
parent | 7008487b8351309a48d9f97cefd41ba15f9af6e7 (diff) | |
download | rneovim-fe1e2eff062605f7e617885011160a678822fd0c.tar.gz rneovim-fe1e2eff062605f7e617885011160a678822fd0c.tar.bz2 rneovim-fe1e2eff062605f7e617885011160a678822fd0c.zip |
fix(lua): avoid vim._with() double-free with cmdmod (#31505)
-rw-r--r-- | src/nvim/lua/stdlib.c | 1 | ||||
-rw-r--r-- | test/functional/lua/with_spec.lua | 17 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c index e719d99640..5ebff3a809 100644 --- a/src/nvim/lua/stdlib.c +++ b/src/nvim/lua/stdlib.c @@ -619,6 +619,7 @@ static int nlua_with(lua_State *L) int rets = 0; cmdmod_T save_cmdmod = cmdmod; + CLEAR_FIELD(cmdmod); cmdmod.cmod_flags = flags; apply_cmdmod(&cmdmod); diff --git a/test/functional/lua/with_spec.lua b/test/functional/lua/with_spec.lua index 6127e83619..92e798e7f3 100644 --- a/test/functional/lua/with_spec.lua +++ b/test/functional/lua/with_spec.lua @@ -1621,4 +1621,21 @@ describe('vim._with', function() matches('Invalid buffer', get_error('{ buf = -1 }, function() end')) matches('Invalid window', get_error('{ win = -1 }, function() end')) end) + + it('no double-free when called from :filter browse oldfiles #31501', function() + exec_lua([=[ + vim.api.nvim_create_autocmd('BufEnter', { + callback = function() + vim._with({ lockmarks = true }, function() end) + end, + }) + vim.cmd([[ + let v:oldfiles = ['Xoldfile'] + call nvim_input('1<CR>') + noswapfile filter /Xoldfile/ browse oldfiles + ]]) + ]=]) + n.assert_alive() + eq('Xoldfile', fn.bufname('%')) + end) end) |