]> granicus.if.org Git - vim/commitdiff
patch 8.2.3097: crash when using "quit" at recovery prompt v8.2.3097
authorBram Moolenaar <Bram@vim.org>
Sun, 4 Jul 2021 11:27:11 +0000 (13:27 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 4 Jul 2021 11:27:11 +0000 (13:27 +0200)
Problem:    Crash when using "quit" at recovery prompt and autocommands are
            triggered.
Solution:   Block autocommands when creating an empty buffer to use as the
            current buffer. (closes #8506)

src/buffer.c
src/testdir/test_swap.vim
src/version.c

index 59f51aaf7a76b7c0c35ade4250fbfbfafd752659..60aa32f0c96a530210e41b058626cfd695d2ee4e 100644 (file)
@@ -1130,7 +1130,12 @@ handle_swap_exists(bufref_T *old_curbuf)
        close_buffer(curwin, curbuf, DOBUF_UNLOAD, FALSE, FALSE);
        if (old_curbuf == NULL || !bufref_valid(old_curbuf)
                                              || old_curbuf->br_buf == curbuf)
+       {
+           // Block autocommands here because curwin->w_buffer is NULL.
+           block_autocmds();
            buf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED);
+           unblock_autocmds();
+       }
        else
            buf = old_curbuf->br_buf;
        if (buf != NULL)
index caacd7e175f32cabf0b81542e9725197a8b4c1bb..4bc325d3332ca3d4db682843966eec85bcc72d60 100644 (file)
@@ -360,6 +360,7 @@ func Test_swap_prompt_splitwin()
   let buf = RunVimInTerminal('', {'rows': 20})
   call term_sendkeys(buf, ":set nomore\n")
   call term_sendkeys(buf, ":set noruler\n")
+
   call term_sendkeys(buf, ":split Xfile1\n")
   call TermWait(buf)
   call WaitForAssert({-> assert_match('^\[O\]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort: $', term_getline(buf, 20))})
@@ -371,8 +372,19 @@ func Test_swap_prompt_splitwin()
   call TermWait(buf)
   call WaitForAssert({-> assert_match('^1$', term_getline(buf, 20))})
   call StopVimInTerminal(buf)
+
+  " This caused Vim to crash when typing "q".
+  " TODO: it does not actually reproduce the crash.
+  call writefile(['au BufAdd * set virtualedit=all'], 'Xvimrc')
+
+  let buf = RunVimInTerminal('-u Xvimrc Xfile1', {'rows': 20, 'wait_for_ruler': 0})
+  call TermWait(buf)
+  call WaitForAssert({-> assert_match('^\[O\]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:', term_getline(buf, 20))})
+  call term_sendkeys(buf, "q")
+
   %bwipe!
   call delete('Xfile1')
+  call delete('Xvimrc')
 endfunc
 
 func Test_swap_symlink()
index fde11a75ec855014ac5491f1ffbe377b71af3c65..f6d5758aca15892ebfca0904e15a6190c32f66f7 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3097,
 /**/
     3096,
 /**/