summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-09-15 19:05:59 +0200
committerBram Moolenaar <Bram@vim.org>2015-09-15 19:05:59 +0200
commit7b256fe7445b46929f660ea74e9090418f857696 (patch)
treeacce5cba0516a0677d8d478ba091e1306487a921 /src
parent2455c4ede8d4ff6f0754977b548708eec08869eb (diff)
patch 7.4.871v7.4.871
Problem: Vim leaks memory, when 'wildignore' filters out all matches. Solution: Free the files array when it becomes empty.
Diffstat (limited to 'src')
-rw-r--r--src/misc1.c48
-rw-r--r--src/version.c2
2 files changed, 30 insertions, 20 deletions
diff --git a/src/misc1.c b/src/misc1.c
index 8b5ea647e8..7eb3dce8b9 100644
--- a/src/misc1.c
+++ b/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
* '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, file, flags)
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, file, flags)
{
char_u *ffname;
- /* check all files in (*file)[] */
- for (i = 0; i < *num_file; ++i)
+ /* check all files in (*files)[] */
+ 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 */
break;
# ifdef VMS
vms_remove_version(ffname);
# 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 */
- vim_free((*file)[i]);
- for (j = i; j + 1 < *num_file; ++j)
- (*file)[j] = (*file)[j + 1];
- --*num_file;
+ /* 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)
+ 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
* 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
index 0cb1fc62b5..20107c5015 100644
--- 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,