# HG changeset patch # User Christian Brabandt # Date 1442337304 -7200 # Node ID 6bc1695b7f11ec19d1c45b58c0f36771e9633d56 # Parent b32e6e4f7aaf2ce92bc2e95454d3294b5a8a06c4 commit https://github.com/vim/vim/commit/7b256fe7445b46929f660ea74e9090418f857696 Author: Bram Moolenaar Date: Tue Sep 15 19:05:59 2015 +0200 patch 7.4.871 Problem: Vim leaks memory, when 'wildignore' filters out all matches. Solution: Free the files array when it becomes empty. diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -9697,14 +9697,14 @@ expand_wildcards_eval(pat, num_file, fil /* * Expand wildcards. Calls gen_expand_wildcards() and removes files matching * 'wildignore'. - * Returns OK or FAIL. When FAIL then "num_file" won't be set. + * Returns OK or FAIL. When FAIL then "num_files" won't be set. */ int -expand_wildcards(num_pat, pat, num_file, file, flags) +expand_wildcards(num_pat, pat, num_files, files, flags) int num_pat; /* number of input patterns */ char_u **pat; /* array of input patterns */ - int *num_file; /* resulting number of files */ - char_u ***file; /* array of resulting files */ + int *num_files; /* resulting number of files */ + char_u ***files; /* array of resulting files */ int flags; /* EW_DIR, etc. */ { int retval; @@ -9712,7 +9712,7 @@ expand_wildcards(num_pat, pat, num_file, char_u *p; int non_suf_match; /* number without matching suffix */ - retval = gen_expand_wildcards(num_pat, pat, num_file, file, flags); + retval = gen_expand_wildcards(num_pat, pat, num_files, files, flags); /* When keeping all matches, return here */ if ((flags & EW_KEEPALL) || retval == FAIL) @@ -9726,47 +9726,55 @@ expand_wildcards(num_pat, pat, num_file, { char_u *ffname; - /* check all files in (*file)[] */ - for (i = 0; i < *num_file; ++i) - { - ffname = FullName_save((*file)[i], FALSE); + /* check all files in (*files)[] */ + for (i = 0; i < *num_files; ++i) + { + ffname = FullName_save((*files)[i], FALSE); if (ffname == NULL) /* out of memory */ break; # ifdef VMS vms_remove_version(ffname); # endif - if (match_file_list(p_wig, (*file)[i], ffname)) - { - /* remove this matching file from the list */ - vim_free((*file)[i]); - for (j = i; j + 1 < *num_file; ++j) - (*file)[j] = (*file)[j + 1]; - --*num_file; + if (match_file_list(p_wig, (*files)[i], ffname)) + { + /* remove this matching files from the list */ + vim_free((*files)[i]); + for (j = i; j + 1 < *num_files; ++j) + (*files)[j] = (*files)[j + 1]; + --*num_files; --i; } vim_free(ffname); } + + /* If the number of matches is now zero, we fail. */ + if (*num_files == 0) + { + vim_free(*files); + *files = NULL; + return FAIL; + } } #endif /* * Move the names where 'suffixes' match to the end. */ - if (*num_file > 1) + if (*num_files > 1) { non_suf_match = 0; - for (i = 0; i < *num_file; ++i) - { - if (!match_suffix((*file)[i])) + for (i = 0; i < *num_files; ++i) + { + if (!match_suffix((*files)[i])) { /* * Move the name without matching suffix to the front * of the list. */ - p = (*file)[i]; + p = (*files)[i]; for (j = i; j > non_suf_match; --j) - (*file)[j] = (*file)[j - 1]; - (*file)[non_suf_match++] = p; + (*files)[j] = (*files)[j - 1]; + (*files)[non_suf_match++] = p; } } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 871, +/**/ 870, /**/ 869,