fix(undo): fix crash caused by checking undolevels in wrong buffer

fixes #24894
This commit is contained in:
bfredl 2023-08-27 11:26:54 +02:00
parent 9b9030ff2c
commit 840749d6c9
2 changed files with 11 additions and 4 deletions

View File

@ -3208,15 +3208,13 @@ u_header_T *u_force_get_undo_header(buf_T *buf)
}
// Create the first undo header for the buffer
if (!uhp) {
// Undo is normally invoked in change code, which already has swapped
// curbuf.
// Args are tricky: this means replace empty range by empty range..
u_savecommon(curbuf, 0, 1, 1, true);
u_savecommon(buf, 0, 1, 1, true);
uhp = buf->b_u_curhead;
if (!uhp) {
uhp = buf->b_u_newhead;
if (get_undolevel(curbuf) > 0 && !uhp) {
if (get_undolevel(buf) > 0 && !uhp) {
abort();
}
}

View File

@ -16,6 +16,7 @@ local command = helpers.command
local bufmeths = helpers.bufmeths
local feed = helpers.feed
local pcall_err = helpers.pcall_err
local assert_alive = helpers.assert_alive
describe('api/buf', function()
before_each(clear)
@ -41,6 +42,14 @@ describe('api/buf', function()
eq(1, curbuf_depr('line_count'))
end)
it("doesn't crash just after set undolevels=1 #24894", function()
local buf = meths.create_buf(false, true)
meths.buf_set_option(buf, 'undolevels', -1)
meths.buf_set_lines(buf, 0, 1, false, { })
assert_alive()
end)
it('cursor position is maintained after lines are inserted #9961', function()
-- replace the buffer contents with these three lines.
request('nvim_buf_set_lines', 0, 0, -1, 1, {"line1", "line2", "line3", "line4"})