From 57e95179abdd851cb2d0c06d4f973575a768e3bb Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 20 Aug 2022 19:26:14 +0100 Subject: 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/filepath.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/filepath.c') diff --git a/src/filepath.c b/src/filepath.c index 0867a51810..ecee8db8b1 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]; -- cgit v1.2.3