0
0
mirror of https://github.com/vim/vim.git synced 2025-10-06 05:44:14 -04:00

patch 7.4.871

Problem:    Vim leaks memory, when 'wildignore' filters out all matches.
Solution:   Free the files array when it becomes empty.
This commit is contained in:
Bram Moolenaar
2015-09-15 19:05:59 +02:00
parent 2455c4ede8
commit 7b256fe744
2 changed files with 30 additions and 20 deletions

View File

@@ -9697,14 +9697,14 @@ expand_wildcards_eval(pat, num_file, file, flags)
/* /*
* Expand wildcards. Calls gen_expand_wildcards() and removes files matching * Expand wildcards. Calls gen_expand_wildcards() and removes files matching
* 'wildignore'. * '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 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 */ int num_pat; /* number of input patterns */
char_u **pat; /* array of input patterns */ char_u **pat; /* array of input patterns */
int *num_file; /* resulting number of files */ int *num_files; /* resulting number of files */
char_u ***file; /* array of resulting files */ char_u ***files; /* array of resulting files */
int flags; /* EW_DIR, etc. */ int flags; /* EW_DIR, etc. */
{ {
int retval; int retval;
@@ -9712,7 +9712,7 @@ expand_wildcards(num_pat, pat, num_file, file, flags)
char_u *p; char_u *p;
int non_suf_match; /* number without matching suffix */ 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 */ /* When keeping all matches, return here */
if ((flags & EW_KEEPALL) || retval == FAIL) if ((flags & EW_KEEPALL) || retval == FAIL)
@@ -9726,47 +9726,55 @@ expand_wildcards(num_pat, pat, num_file, file, flags)
{ {
char_u *ffname; char_u *ffname;
/* check all files in (*file)[] */ /* check all files in (*files)[] */
for (i = 0; i < *num_file; ++i) for (i = 0; i < *num_files; ++i)
{ {
ffname = FullName_save((*file)[i], FALSE); ffname = FullName_save((*files)[i], FALSE);
if (ffname == NULL) /* out of memory */ if (ffname == NULL) /* out of memory */
break; break;
# ifdef VMS # ifdef VMS
vms_remove_version(ffname); vms_remove_version(ffname);
# endif # endif
if (match_file_list(p_wig, (*file)[i], ffname)) if (match_file_list(p_wig, (*files)[i], ffname))
{ {
/* remove this matching file from the list */ /* remove this matching files from the list */
vim_free((*file)[i]); vim_free((*files)[i]);
for (j = i; j + 1 < *num_file; ++j) for (j = i; j + 1 < *num_files; ++j)
(*file)[j] = (*file)[j + 1]; (*files)[j] = (*files)[j + 1];
--*num_file; --*num_files;
--i; --i;
} }
vim_free(ffname); 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 #endif
/* /*
* Move the names where 'suffixes' match to the end. * Move the names where 'suffixes' match to the end.
*/ */
if (*num_file > 1) if (*num_files > 1)
{ {
non_suf_match = 0; non_suf_match = 0;
for (i = 0; i < *num_file; ++i) for (i = 0; i < *num_files; ++i)
{ {
if (!match_suffix((*file)[i])) if (!match_suffix((*files)[i]))
{ {
/* /*
* Move the name without matching suffix to the front * Move the name without matching suffix to the front
* of the list. * of the list.
*/ */
p = (*file)[i]; p = (*files)[i];
for (j = i; j > non_suf_match; --j) for (j = i; j > non_suf_match; --j)
(*file)[j] = (*file)[j - 1]; (*files)[j] = (*files)[j - 1];
(*file)[non_suf_match++] = p; (*files)[non_suf_match++] = p;
} }
} }
} }

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
871,
/**/ /**/
870, 870,
/**/ /**/