diff options
author | luukvbaal <luukvbaal@gmail.com> | 2025-02-12 17:20:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-12 08:20:51 -0800 |
commit | 15bc930fca94a43fb5546b48d7c09cf223b63233 (patch) | |
tree | 6da987ed997e4f5b7955522967b4db6a41ff4424 | |
parent | be8d87014c0c120ece50aabff307c1f5d9167ec0 (diff) | |
download | rneovim-15bc930fca94a43fb5546b48d7c09cf223b63233.tar.gz rneovim-15bc930fca94a43fb5546b48d7c09cf223b63233.tar.bz2 rneovim-15bc930fca94a43fb5546b48d7c09cf223b63233.zip |
fix(memline): don't check line count for closed memline #32403
Problem: Error thrown when for invalid line number which may be accessed
in an `on_detach` callback at which point line count is
intentionally set to 0.
Solution: Move empty memline check to before line number check.
-rw-r--r-- | src/nvim/memline.c | 10 | ||||
-rw-r--r-- | test/functional/lua/buffer_updates_spec.lua | 18 |
2 files changed, 23 insertions, 5 deletions
diff --git a/src/nvim/memline.c b/src/nvim/memline.c index fb7fdfb8b2..047bbbfdaa 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -1875,6 +1875,11 @@ static char *ml_get_buf_impl(buf_T *buf, linenr_T lnum, bool will_change) static int recursive = 0; static char questions[4]; + if (buf->b_ml.ml_mfp == NULL) { // there are no lines + buf->b_ml.ml_line_len = 1; + return ""; + } + if (lnum > buf->b_ml.ml_line_count) { // invalid line number if (recursive == 0) { // Avoid giving this message for a recursive call, may happen when @@ -1892,11 +1897,6 @@ errorret: } lnum = MAX(lnum, 1); // pretend line 0 is line 1 - if (buf->b_ml.ml_mfp == NULL) { // there are no lines - buf->b_ml.ml_line_len = 1; - return ""; - } - // See if it is the same line as requested last time. // Otherwise may need to flush last used line. // Don't use the last used line when 'swapfile' is reset, need to load all diff --git a/test/functional/lua/buffer_updates_spec.lua b/test/functional/lua/buffer_updates_spec.lua index 7d034222c8..b9c1e9f897 100644 --- a/test/functional/lua/buffer_updates_spec.lua +++ b/test/functional/lua/buffer_updates_spec.lua @@ -305,6 +305,24 @@ describe('lua buffer event callbacks: on_lines', function() n.assert_alive() end) + it('no invalid lnum error for closed memline in on_detach #31251', function() + eq(vim.NIL, exec_lua('return _G.did_detach')) + exec_lua([[ + vim.api.nvim_buf_set_lines(0, 0, -1, false, { '' }) + local bufname = 'buf2' + local buf = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_name(buf, bufname) + vim.bo[buf].bufhidden = 'wipe' + vim.cmd('vertical diffsplit '..bufname) + vim.api.nvim_buf_attach(0, false, { on_detach = function() + vim.cmd("redraw") + _G.did_detach = true + end}) + vim.cmd.bdelete() + ]]) + eq(true, exec_lua('return _G.did_detach')) + end) + it('#12718 lnume', function() api.nvim_buf_set_lines(0, 0, -1, true, { '1', '2', '3' }) exec_lua(function() |