changeset: 6375:45fbc40193aa
user:      Kevin McCarthy <[email protected]>
date:      Fri Oct 10 14:17:09 2014 +0800
link:      http://dev.mutt.org/hg/mutt/rev/45fbc40193aa

Fix a memory leak in mutt_query_complete.

When a single result was returned, it was written to the buffer and
returned, but the query result was never freed.

This patch creates a free_query function and changes the code to use
that everywhere.

diffs (73 lines):

diff -r b1ef16f25425 -r 45fbc40193aa query.c
--- a/query.c   Thu Aug 21 18:41:07 2014 -0700
+++ b/query.c   Fri Oct 10 14:17:09 2014 +0800
@@ -70,6 +70,25 @@
   return tmp;
 }
 
+static void free_query (QUERY **query)
+{
+  QUERY *p;
+
+  if (!query)
+    return;
+
+  while (*query)
+  {
+    p = *query;
+    *query = (*query)->next;
+
+    rfc822_free_address (&p->addr);
+    FREE (&p->name);
+    FREE (&p->other);
+    FREE (&p);
+  }
+}
+
 static QUERY *run_query (char *s, int quiet)
 {
   FILE *fp;
@@ -258,6 +277,7 @@
       buf[0] = '\0';
       rfc822_write_address (buf, buflen, tmpa, 0);
       rfc822_free_address (&tmpa);
+      free_query (&results);
       mutt_clear_error ();
       return (0);
     }
@@ -348,16 +368,7 @@
 
              if (op == OP_QUERY)
              {
-               queryp = results;
-               while (queryp)
-               {
-                 rfc822_free_address (&queryp->addr);
-                 FREE (&queryp->name);
-                 FREE (&queryp->other);
-                 results = queryp->next;
-                 FREE (&queryp);
-                 queryp = results;
-               }
+                free_query (&results);
                results = newresults;
                FREE (&QueryTable);
              }
@@ -520,16 +531,7 @@
       
     }
 
-    queryp = results;
-    while (queryp)
-    {
-      rfc822_free_address (&queryp->addr);
-      FREE (&queryp->name);
-      FREE (&queryp->other);
-      results = queryp->next;
-      FREE (&queryp);
-      queryp = results;
-    }
+    free_query (&results);
     FREE (&QueryTable);
     
     /* tell whoever called me to redraw the screen when I return */

Reply via email to