From 57e95179abdd851cb2d0c06d4f973575a768e3bb Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 20 Aug 2022 19:26:14 +0100 Subject: [PATCH] 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 #10946) --- src/cmdexpand.c | 5 +++-- src/filepath.c | 11 +++++++---- src/version.c | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index ff6aa0d03..fb329a57d 100644 --- 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 index 0867a5181..ecee8db8b 100644 --- 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 index 9ce33cdbc..9b98edcc6 100644 --- a/src/version.c +++ b/src/version.c @@ -731,6 +731,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 231, /**/ 230, /**/ -- 2.40.0