# HG changeset patch # User Bram Moolenaar # Date 1661020203 -7200 # Node ID 86c203dbf12bd68e405f93adde1af089d6b6bda2 # Parent 9b0585023aff467efb496a6ca6899ea4bcb0e855 patch 9.0.0231: expanding "**" may loop forever with directory links Commit: https://github.com/vim/vim/commit/57e95179abdd851cb2d0c06d4f973575a768e3bb Author: Bram Moolenaar 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) diff --git a/src/cmdexpand.c b/src/cmdexpand.c --- 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) diff --git a/src/filepath.c b/src/filepath.c --- 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]; diff --git a/src/version.c b/src/version.c --- 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,