Commit: patch 9.2.0661: unintended wipe of Vim's temp dir, causes errors

3 views
Skip to first unread message

Christian Brabandt

unread,
Jun 16, 2026, 4:30:12 PM (2 days ago) Jun 16
to vim...@googlegroups.com
patch 9.2.0661: unintended wipe of Vim's temp dir, causes errors

Commit: https://github.com/vim/vim/commit/4a792c9cc5654d0b134c56b4b8acd61b081c83b9
Author: Christian Brabandt <c...@256bit.org>
Date: Tue Jun 16 20:11:03 2026 +0000

patch 9.2.0661: unintended wipe of Vim's temp dir, causes errors

Problem: Unintended wipe of Vim's temp dir, causes errors and may also
leak temporary data (David Leadbeater)
Solution: In vim_tempname() verify the temp directory still exists (via
its open file descriptor) and re-create it if it was removed.

Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/fileio.c b/src/fileio.c
index af0360dc8..255e1b33d 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -5370,6 +5370,19 @@ vim_closetempdir(void)
closedir(vim_tempdir_dp);
vim_tempdir_dp = NULL;
}
+
+/*
+ * Return true if the temp directory we created is gone.
+ */
+ static bool
+vim_tempdir_gone(void)
+{
+ stat_T st;
+
+ if (vim_tempdir_dp == NULL)
+ return false;
+ return fstat(dirfd(vim_tempdir_dp), &st) < 0 || st.st_nlink == 0;
+}
# endif

/*
@@ -5450,6 +5463,15 @@ vim_tempname(
stat_T st;
# endif

+# if defined(UNIX) && defined(HAVE_FLOCK) && defined(HAVE_DIRFD)
+ // if the temp directory is gone, force re-creation of it
+ if (vim_tempdir != NULL && vim_tempdir_gone())
+ {
+ vim_closetempdir();
+ VIM_CLEAR(vim_tempdir);
+ }
+# endif
+
/*
* This will create a directory for private use by this instance of Vim.
* This is done once, and the same directory is used for all temp files.
diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim
index a07ed6ead..3797fb73a 100644
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -7729,6 +7729,23 @@ func Test_builtin_fullcommand()

endfunc

+" Test that temporary directory is re-created after wipeout {{{1
+func Test_delete_temp_dir()
+ " assumes Unix has always flock/dirfd support
+ CheckUnix
+ let a = tempname()
+ let dir = fnamemodify(a, ':h')
+ call delete(dir, 'rf')
+
+ let newdir = fnamemodify(tempname(), ':h')
+ call assert_notequal(dir, newdir)
+ " if the test fails (e.g. because vim has no support for flock/dirfd,
+ " recreate the directory, to prevent followup test failures
+ if dir == newdir
+ call mkdir(dir, '', 0o700)
+ endif
+endfunc
+
"-------------------------------------------------------------------------------
" Modelines {{{1
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index b548ef9c9..9824f5891 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 661,
/**/
660,
/**/
Reply all
Reply to author
Forward
0 new messages