changeset 29784:86c203dbf12b v9.0.0231

patch 9.0.0231: expanding "**" may loop forever with directory links Commit: https://github.com/vim/vim/commit/57e95179abdd851cb2d0c06d4f973575a768e3bb Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 20 19:26:14 2022 +0100 patch 9.0.0231: expanding "**" may loop forever with directory links Problem: Expanding "**" may loop forever with directory links. Solution: Check for being interrupted. (closes https://github.com/vim/vim/issues/10946)
author Bram Moolenaar <Bram@vim.org>
date Sat, 20 Aug 2022 20:30:03 +0200
parents 9b0585023aff
children 05470b775db2
files src/cmdexpand.c src/filepath.c src/version.c
diffstat 3 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -722,8 +722,9 @@ ExpandOne(
 	findex = -1;			    // next p_wc gets first one
     }
 
-    // Concatenate all matching names
-    if (mode == WILD_ALL && xp->xp_numfiles > 0)
+    // Concatenate all matching names.  Unless interrupted, this can be slow
+    // and the result probably won't be used.
+    if (mode == WILD_ALL && xp->xp_numfiles > 0 && !got_int)
     {
 	len = 0;
 	for (i = 0; i < xp->xp_numfiles; ++i)
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -3180,8 +3180,9 @@ expand_wildcards(
 
     /*
      * Move the names where 'suffixes' match to the end.
+     * Skip when interrupted, the result probably won't be used.
      */
-    if (*num_files > 1)
+    if (*num_files > 1 && !got_int)
     {
 	non_suf_match = 0;
 	for (i = 0; i < *num_files; ++i)
@@ -3719,7 +3720,7 @@ unix_expandpath(
     // Find all matching entries
     if (dirp != NULL)
     {
-	for (;;)
+	while (!got_int)
 	{
 	    dp = readdir(dirp);
 	    if (dp == NULL)
@@ -3789,8 +3790,10 @@ unix_expandpath(
     vim_free(buf);
     vim_regfree(regmatch.regprog);
 
+    // When interrupted the matches probably won't be used and sorting can be
+    // slow, thus skip it.
     matches = gap->ga_len - start_len;
-    if (matches > 0)
+    if (matches > 0 && !got_int)
 	qsort(((char_u **)gap->ga_data) + start_len, matches,
 						   sizeof(char_u *), pstrcmp);
     return matches;
@@ -3918,7 +3921,7 @@ gen_expand_wildcards(
      */
     ga_init2(&ga, sizeof(char_u *), 30);
 
-    for (i = 0; i < num_pat; ++i)
+    for (i = 0; i < num_pat && !got_int; ++i)
     {
 	add_pat = -1;
 	p = pat[i];
--- a/src/version.c
+++ b/src/version.c
@@ -732,6 +732,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    231,
+/**/
     230,
 /**/
     229,