]> granicus.if.org Git - neomutt/commitdiff
header: add HEADER->free_cb() to free driver specific data
authorKarel Zak <kzak@redhat.com>
Thu, 15 Dec 2011 16:58:18 +0000 (17:58 +0100)
committerRichard Russon <rich@flatcap.org>
Mon, 14 Mar 2016 23:11:40 +0000 (23:11 +0000)
The mutt_free_header() need to care about driver specific data.

BTW, it seems that there is a leak in imap code -- it does not free
HEADER->data->keywords list.

Signed-off-by: Karel Zak <kzak@redhat.com>
mutt.h
mutt_notmuch.c
muttlib.c

diff --git a/mutt.h b/mutt.h
index def2ca894a5c65620a12d053b10dd42ab7288efb..7f8492d796d1d4827a1dce711fabf8b2fd0b32bc 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -799,6 +799,7 @@ typedef struct header
 
 #if defined USE_POP || defined USE_IMAP || defined USE_NOTMUCH
   void *data;                  /* driver-specific data */
+  void (*free_cb)(struct header *); /* driver-specific data free function */
 #endif
   
   char *maildir_flags;         /* unknown maildir flags */
index 0164922c1cd03fd6e12f02a2e8d423e7ea8e3965..b04f60c049c87d50eeb26503658424cae21230cb 100644 (file)
@@ -152,7 +152,7 @@ err:
        return -1;
 }
 
-static void free_hdrdata(HEADER *h)
+static void free_header_data(HEADER *h)
 {
        struct nm_hdrdata *data = h->data;
 
@@ -174,7 +174,7 @@ static int free_data(CONTEXT *ctx)
                HEADER *h = ctx->hdrs[i];
 
                if (h)
-                       free_hdrdata(h);
+                       free_header_data(h);
        }
 
        if (data) {
@@ -393,6 +393,8 @@ static struct nm_hdrdata *create_hdrdata(HEADER *h, const char *path,
                data->id = safe_strdup(id);
 
        h->data = data;
+       h->free_cb = free_header_data;
+
        init_message_tags(data, msg);
 
        return data;
index 9dd8ac6ae1fa72cc91e54dec4e5b650a8cc1bc94..6c98dead655de57f7ec12a5e98acfb9e911c1a76 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
 #include "imap.h"
 #endif
 
+#ifdef USE_NOTMUCH
+#include "mutt_notmuch.h"
+#endif
+
 #include "mutt_crypt.h"
 
 #include <string.h>
@@ -330,7 +334,9 @@ void mutt_free_header (HEADER **h)
 #ifdef MIXMASTER
   mutt_free_list (&(*h)->chain);
 #endif
-#if defined USE_POP || defined USE_IMAP
+#if defined USE_POP || defined USE_IMAP || defined USE_NOTMUCH
+  if ((*h)->free_cb)
+    (*h)->free_cb(*h);
   FREE (&(*h)->data);
 #endif
   FREE (h);            /* __FREE_CHECKED__ */