]> granicus.if.org Git - mutt/commitdiff
Parse and store mime headers in the BODY.
authorKevin McCarthy <kevin@8t8.us>
Mon, 10 Dec 2018 01:41:58 +0000 (17:41 -0800)
committerKevin McCarthy <kevin@8t8.us>
Mon, 17 Dec 2018 21:29:58 +0000 (13:29 -0800)
Don't store the field in the header cache though.

hcache.c
mutt.h
muttlib.c
parse.c

index 4f2bac29e8766b0a0deb34a3492f339120243e9f..08cfa9211f8b0669a80a7e71b3ccf21cd6128d23 100644 (file)
--- a/hcache.c
+++ b/hcache.c
@@ -468,6 +468,7 @@ dump_body(BODY * c, unsigned char *d, int *off, int convert)
   nb.parts = NULL;
   nb.hdr = NULL;
   nb.aptr = NULL;
+  nb.mime_headers = NULL;
 
   lazy_realloc(&d, *off + sizeof (BODY));
   memcpy(d + *off, &nb, sizeof (BODY));
diff --git a/mutt.h b/mutt.h
index c6b5db5671381543b680c8f52c0a281636dbd0aa..90d63f7ae67c03eff5d4464f7e99d1205770b4ce 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -734,7 +734,9 @@ typedef struct body
   time_t stamp;                        /* time stamp of last
                                 * encoding update.
                                 */
-  
+
+  struct envelope *mime_headers; /* memory hole protected headers */
+
   unsigned int type : 4;        /* content-type primary type */
   unsigned int encoding : 3;    /* content-transfer-encoding */
   unsigned int disposition : 2; /* content-disposition */
index 7789479c03928ce5b7f76b3cd94783ef1fd3d554..2ae92ee75a135a9fa818b39ba83c4f7e9e9f7132 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -226,6 +226,8 @@ void mutt_free_body (BODY **p)
       mutt_free_header(&b->hdr);
     }
 
+    mutt_free_envelope (&b->mime_headers);
+
     if (b->parts)
       mutt_free_body (&b->parts);
 
diff --git a/parse.c b/parse.c
index af3911d990415cd0f3315b0032719932e65d5864..44251123613ea842717c8bed161cc9df928c25cb 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -410,6 +410,7 @@ static void parse_content_disposition (const char *s, BODY *ct)
 BODY *mutt_read_mime_header (FILE *fp, int digest)
 {
   BODY *p = mutt_new_body();
+  ENVELOPE *e = mutt_new_envelope ();
   char *c;
   char *line = safe_malloc (LONG_STRING);
   size_t linelen = LONG_STRING;
@@ -469,6 +470,11 @@ BODY *mutt_read_mime_header (FILE *fp, int digest)
       }
     }
 #endif
+    else
+    {
+      if (mutt_parse_rfc822_line (e, NULL, line, c, 0, 0, 0, NULL))
+        p->mime_headers = e;
+    }
   }
   p->offset = ftello (fp); /* Mark the start of the real data */
   if (p->type == TYPETEXT && !p->subtype)
@@ -478,6 +484,11 @@ BODY *mutt_read_mime_header (FILE *fp, int digest)
 
   FREE (&line);
 
+  if (p->mime_headers)
+    rfc2047_decode_envelope (p->mime_headers);
+  else
+    mutt_free_envelope (&e);
+
   return (p);
 }