Fix big leak on mimeinfo freeing
[claws.git] / src / procmime.c
index 44e546c3a930f3e2fef8b5552fdd933041a5030d..da81590ffe12297c360c8f0021bedffd227a10c2 100644 (file)
@@ -52,6 +52,7 @@
 #include "alertpanel.h"
 #include "timing.h"
 #include "privacy.h"
+#include "account.h"
 
 static GHashTable *procmime_get_mime_type_table        (void);
 static MimeInfo *procmime_scan_file_short(const gchar *filename);
@@ -137,6 +138,8 @@ static gboolean free_func(GNode *node, gpointer data)
        if (mimeinfo->privacy)
                privacy_free_privacydata(mimeinfo->privacy);
 
+       g_free(mimeinfo);
+
        return FALSE;
 }
 
@@ -153,7 +156,6 @@ void procmime_mimeinfo_free_all(MimeInfo **mimeinfo_ptr)
 
        g_node_destroy(node);
 
-       g_free(mimeinfo);
        *mimeinfo_ptr = NULL;
 }
 
@@ -293,7 +295,8 @@ static int procmime_fclose(FILE *fp)
                gint llen = 0;                                                  \
                strretchomp(lastline);                                          \
                llen = strlen(lastline);                                        \
-               if (lastline[llen-1] == ' ' && strcmp(lastline,"-- ")) {        \
+               if (lastline[llen-1] == ' ' && !account_signatures_matchlist_str_found(lastline, "%s") &&       \
+                   !(llen == 2 && lastline[1] == ' ' && strchr(prefs_common.quote_chars, lastline[0]))) {                                      \
                        /* this is flowed */                                    \
                        if (delsp)                                              \
                                lastline[llen-1] = '\0';                        \
@@ -380,11 +383,14 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
        tmp_file = TRUE;
        readend = mimeinfo->offset + mimeinfo->length;
 
+       account_signatures_matchlist_create(); /* FLUSH_LASTLINE will use it */
+
+       *buf = '\0';
        if (encoding == ENC_QUOTED_PRINTABLE) {
                while ((ftell(infp) < readend) && (SC_FGETS(buf, sizeof(buf), infp) != NULL)) {
                        gint len;
                        len = qp_decode_line(buf);
-                       buf[len]='\0';
+                       buf[len] = '\0';
                        if (!flowed) {
                                if (SC_FWRITE(buf, 1, len, outfp) < len)
                                        err = TRUE;
@@ -500,6 +506,8 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
        procmime_fclose(outfp);
        procmime_fclose(infp);
 
+       account_signatures_matchlist_delete();
+
        if (err == TRUE) {
                return FALSE;
        }