patch 9.2.0182: autocmds may leave windows with w_locked set
Commit:
https://github.com/vim/vim/commit/bae31c35bb858ee44160a5663987e7929ee6a377
Author: Sean Dewar <[email protected]>
Date: Mon Mar 16 21:54:28 2026 +0000
patch 9.2.0182: autocmds may leave windows with w_locked set
Problem: autocmds that switch windows may cause them to remain with
w_locked set, preventing them from being closed longer than
intended.
Solution: Unset w_locked in the window where it was set (Sean Dewar).
closes: #19716
Signed-off-by: Sean Dewar <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/src/arglist.c b/src/arglist.c
index 657e2790a..455d89713 100644
--- a/src/arglist.c
+++ b/src/arglist.c
@@ -193,12 +193,14 @@ alist_add(
char_u *fname,
int set_fnum) // 1: set buffer number; 2: re-use
curbuf
{
+ win_T *wp = curwin;
+
if (fname == NULL) // don't add NULL file names
return;
if (check_arglist_locked() == FAIL)
return;
arglist_locked = TRUE;
- curwin->w_locked = TRUE;
+ wp->w_locked = TRUE;
#ifdef BACKSLASH_IN_FILENAME
slash_adjust(fname);
@@ -210,7 +212,7 @@ alist_add(
++al->al_ga.ga_len;
arglist_locked = FALSE;
- curwin->w_locked = FALSE;
+ wp->w_locked = FALSE;
}
#if defined(BACKSLASH_IN_FILENAME)
@@ -361,6 +363,8 @@ alist_add_list(
if (check_arglist_locked() != FAIL
&& GA_GROW_OK(&ALIST(curwin)->al_ga, count))
{
+ win_T *wp = curwin;
+
if (after < 0)
after = 0;
if (after > ARGCOUNT)
@@ -369,7 +373,7 @@ alist_add_list(
mch_memmove(&(ARGLIST[after + count]), &(ARGLIST[after]),
(ARGCOUNT - after) * sizeof(aentry_T));
arglist_locked = TRUE;
- curwin->w_locked = TRUE;
+ wp->w_locked = TRUE;
for (i = 0; i < count; ++i)
{
int flags = BLN_LISTED | (will_edit ? BLN_CURBUF : 0);
@@ -378,10 +382,10 @@ alist_add_list(
ARGLIST[after + i].ae_fnum = buflist_add(files[i], flags);
}
arglist_locked = FALSE;
- curwin->w_locked = FALSE;
- ALIST(curwin)->al_ga.ga_len += count;
- if (old_argcount > 0 && curwin->w_arg_idx >= after)
- curwin->w_arg_idx += count;
+ wp->w_locked = FALSE;
+ ALIST(wp)->al_ga.ga_len += count;
+ if (old_argcount > 0 && wp->w_arg_idx >= after)
+ wp->w_arg_idx += count;
return;
}
diff --git a/src/terminal.c b/src/terminal.c
index 68b712b18..aaf30a183 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -3730,14 +3730,16 @@ term_after_channel_closed(term_T *term)
aucmd_prepbuf(&aco, term->tl_buffer);
if (curbuf == term->tl_buffer)
{
+ win_T *wp = curwin;
+
// Avoid closing the window if we temporarily use it.
- if (is_aucmd_win(curwin))
+ if (is_aucmd_win(wp))
do_set_w_locked = TRUE;
if (do_set_w_locked)
- curwin->w_locked = TRUE;
+ wp->w_locked = TRUE;
do_bufdel(DOBUF_WIPE, (char_u *)"", 1, fnum, fnum, FALSE);
if (do_set_w_locked)
- curwin->w_locked = FALSE;
+ wp->w_locked = FALSE;
aucmd_restbuf(&aco);
}
#ifdef FEAT_PROP_POPUP
diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim
index ed3ea718c..f62d2cfab 100644
--- a/src/testdir/test_arglist.vim
+++ b/src/testdir/test_arglist.vim
@@ -798,4 +798,24 @@ func Test_crash_arglist_uaf2()
au! BufAdd
endfunc
+func Test_arglist_w_locked_unlock()
+ au BufAdd * split
+
+ args a
+ call assert_equal(2, winnr('$'))
+ wincmd p
+ quit
+ call assert_equal(1, winnr('$'))
+
+ argedit b
+ call assert_equal(2, winnr('$'))
+ wincmd p
+ quit
+ call assert_equal(1, winnr('$'))
+
+ %argd
+ %bw!
+ au! BufAdd
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 9164ae0a7..8b3b8e952 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 182,
/**/
181,
/**/
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1w2Fyn-008wPG-Qk%40256bit.org.