aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-12-08 09:25:43 +0800
committerGitHub <noreply@github.com>2024-12-08 09:25:43 +0800
commitfe1e2eff062605f7e617885011160a678822fd0c (patch)
tree995ffe7aebd06a035d4315b868e35782c95b4aa4
parent7008487b8351309a48d9f97cefd41ba15f9af6e7 (diff)
downloadrneovim-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.c1
-rw-r--r--test/functional/lua/with_spec.lua17
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)