From: Karel Zak Date: Thu, 15 Dec 2011 16:58:18 +0000 (+0100) Subject: header: add HEADER->free_cb() to free driver specific data X-Git-Tag: neomutt-20160404~13^2~94 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c9b92efe770a278a4abc179d54b44326ec6fda14;p=neomutt header: add HEADER->free_cb() to free driver specific data 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 --- diff --git a/mutt.h b/mutt.h index 953b6210c..4049afcd2 100644 --- a/mutt.h +++ b/mutt.h @@ -810,6 +810,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 */ diff --git a/mutt_notmuch.c b/mutt_notmuch.c index 0164922c1..b04f60c04 100644 --- a/mutt_notmuch.c +++ b/mutt_notmuch.c @@ -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; diff --git a/muttlib.c b/muttlib.c index 58badfe91..3fc0ae2eb 100644 --- a/muttlib.c +++ b/muttlib.c @@ -32,6 +32,10 @@ #include "imap.h" #endif +#ifdef USE_NOTMUCH +#include "mutt_notmuch.h" +#endif + #include "mutt_crypt.h" #include @@ -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__ */