mirror of
https://github.com/neovim/neovim.git
synced 2026-07-17 06:31:16 +00:00
backport: fix(api): LuaRef leak in nvim_set_keymap on LHS too long (>=66 bytes) (#39376)
Problem: `nvim_set_keymap` leaks the `callback` `LuaRef` when the
LHS is too long.
Solution: Make `set_maparg_lhs_rhs` transfer `rhs_lua` to
`MapArguments` up front so the caller always owns the ref.
(cherry picked from commit 58aad59e1c)
Co-authored-by: Barrett Ruth <62671086+barrettruth@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
3c45cb3bf6
commit
4df16ecdb9
@@ -302,6 +302,7 @@ static bool set_maparg_lhs_rhs(const char *const orig_lhs, const size_t orig_lhs
|
|||||||
const LuaRef rhs_lua, const char *const cpo_val,
|
const LuaRef rhs_lua, const char *const cpo_val,
|
||||||
MapArguments *const mapargs)
|
MapArguments *const mapargs)
|
||||||
{
|
{
|
||||||
|
mapargs->rhs_lua = rhs_lua;
|
||||||
char lhs_buf[128];
|
char lhs_buf[128];
|
||||||
|
|
||||||
// If mapping has been given as ^V<C_UP> say, then replace the term codes
|
// If mapping has been given as ^V<C_UP> say, then replace the term codes
|
||||||
|
|||||||
@@ -617,6 +617,23 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
|
|||||||
eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(api.nvim_del_keymap, '', lhs))
|
eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(api.nvim_del_keymap, '', lhs))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('does not leak callback LuaRef on too-long LHS #39351', function()
|
||||||
|
eq(
|
||||||
|
0,
|
||||||
|
exec_lua(function()
|
||||||
|
local weak = setmetatable({}, { __mode = 'v' })
|
||||||
|
for i = 1, 2 do
|
||||||
|
local cb = function() end
|
||||||
|
weak[i] = cb
|
||||||
|
local ok = pcall(vim.api.nvim_set_keymap, 'n', ('a'):rep(66), '', { callback = cb })
|
||||||
|
assert(not ok)
|
||||||
|
end
|
||||||
|
collectgarbage('collect')
|
||||||
|
return vim.tbl_count(weak)
|
||||||
|
end)
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
it('does not throw errors when rhs is longer than MAXMAPLEN', function()
|
it('does not throw errors when rhs is longer than MAXMAPLEN', function()
|
||||||
local MAXMAPLEN = 50
|
local MAXMAPLEN = 50
|
||||||
local rhs = ''
|
local rhs = ''
|
||||||
|
|||||||
Reference in New Issue
Block a user