changeset 7119:6bc1695b7f11 v7.4.871

commit https://github.com/vim/vim/commit/7b256fe7445b46929f660ea74e9090418f857696 Author: Bram Moolenaar <Bram@vim.org> 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.
author Christian Brabandt <cb@256bit.org>
date Tue, 15 Sep 2015 19:15:04 +0200
parents b32e6e4f7aaf
children 4fee246cf1b4
files src/misc1.c src/version.c
diffstat 2 files changed, 33 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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;
 	    }
 	}
     }
--- 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,