Mercurial > vim
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];