mhparse add support for CRLF
authorPhilipp Takacs <philipp@bureaucracy.de>
Fri, 25 Nov 2016 12:38:04 +0000 (13:38 +0100)
committerPhilipp Takacs <philipp@bureaucracy.de>
Fri, 6 Jan 2017 20:40:49 +0000 (21:40 +0100)
multipart mime content wasn't able to parse, if the
mail use CRLF line endings.

h/mhparse.h
uip/mhparse.c

index 782ab51..1ff37bf 100644 (file)
@@ -91,6 +91,7 @@ struct Content {
        char *c_partno;              /* within multipart content          */
 
        /* Content-Type info */
        char *c_partno;              /* within multipart content          */
 
        /* Content-Type info */
+       boolean crlf;                /* are the line ending CRLF          */
        struct CTinfo c_ctinfo;      /* parsed elements of Content-Type   */
        int c_type;                  /* internal flag for content type    */
        int c_subtype;               /* internal flag for content subtype */
        struct CTinfo c_ctinfo;      /* parsed elements of Content-Type   */
        int c_type;                  /* internal flag for content type    */
        int c_subtype;               /* internal flag for content subtype */
index 8e8b360..a478b42 100644 (file)
@@ -254,6 +254,9 @@ get_content(FILE *in, char *file, int toplevel)
                        state = FLD2;
                        /* FALL */
                case FLD2:
                        state = FLD2;
                        /* FALL */
                case FLD2:
+                       if (compnum == 1) {
+                               ct->crlf = f.value[f.valuelen-2] == '\r';
+                       }
                        compnum++;
 
                        /* add the header data to the list */
                        compnum++;
 
                        /* add the header data to the list */
@@ -1072,8 +1075,14 @@ InitMultiPart(CT ct)
        *++dp = '\0';
 
        /* record boundary separators */
        *++dp = '\0';
 
        /* record boundary separators */
-       m->mp_start = concat(bp, "\n", NULL);
-       m->mp_stop = concat(bp, "--\n", NULL);
+       if (!ct->crlf) {
+               m->mp_start = concat(bp, "\n", NULL);
+               m->mp_stop = concat(bp, "--\n", NULL);
+       } else {
+               m->mp_start = concat(bp, "\r\n", NULL);
+               m->mp_stop = concat(bp, "--\r\n", NULL);
+       }
+
 
        if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
                advise(ct->c_file, "unable to open for reading");
 
        if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) {
                advise(ct->c_file, "unable to open for reading");