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:
48
src/misc1.c
48
src/misc1.c
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user