]> git.lizzy.rs Git - plan9front.git/commitdiff
upas/fs: move unixheader handling to parseheaders()
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 28 Jun 2020 22:23:37 +0000 (00:23 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 28 Jun 2020 22:23:37 +0000 (00:23 +0200)
parsing the unixheader in mdir fetch routine is the wrong place,
as no invalid character handling has been performed yet. also
the string is not neccesarily null terminated.

avoid duplication with plan9 mbox parsing and just do it in
parseheaders(), which already handles faking the unix headers
for pop3 and imap.

sys/src/cmd/upas/fs/mbox.c
sys/src/cmd/upas/fs/mdir.c
sys/src/cmd/upas/fs/plan9.c

index 0c7f440ff66806ffc1e0507ee1b3f291e2dbc166..878d09b2730fc0188e6f2f2f745c9bf0ae49238f 100644 (file)
@@ -476,6 +476,20 @@ parseattachments(Message *m, Mailbox *mb)
        }
 }
 
+static void
+parseunix(Message *m)
+{
+       char *s, *p;
+
+       m->unixheader = smprint("%.*s", utfnlen(m->start, m->header - m->start), m->start);
+       s = m->start + 5;
+       if((p = strchr(s, ' ')) == nil)
+               return;
+       *p = 0;
+       m->unixfrom = strdup(s);
+       *p = ' ';
+}
+
 void
 parseheaders(Mailbox *mb, Message *m, int addfrom, int justmime)
 {
@@ -483,8 +497,20 @@ parseheaders(Mailbox *mb, Message *m, int addfrom, int justmime)
        int i, i0, n;
        uintptr a;
 
+       if(m->header == nil)
+               m->header = m->start;
+
+       /* parse unix header */
+       if(!justmime && !addfrom && m->unixheader == nil){
+               if(strncmp(m->start, "From ", 5) == 0)
+               if((e = memchr(m->start, '\n', m->end - m->start)) != nil){
+                       m->header = e + 1;
+                       parseunix(m);
+               }
+       }
+
        /* parse mime headers */
-       p = m->header;
+       p = m->mheader = m->mhend = m->header;
        i0 = 0;
        if(justmime)
                i0 = Mhead;
@@ -520,11 +546,6 @@ parseheaders(Mailbox *mb, Message *m, int addfrom, int justmime)
                m->hend = p;
                m->mhend = m->header;
        }
-       /*
-        * not all attachments have mime headers themselves.
-        */
-       if(!m->mheader)
-               m->mhend = 0;
        if(*p == '\n')
                p++;
        m->rbody = m->body = p;
@@ -538,9 +559,10 @@ parseheaders(Mailbox *mb, Message *m, int addfrom, int justmime)
         *  adding the unix header all the time screws up mime-attached
         *  rfc822 messages.
         */
-       if(!addfrom && !m->unixfrom)
+       if(!addfrom && m->unixfrom == nil) {
+               free(m->unixheader);
                m->unixheader = nil;
-       else if(m->unixheader == nil){
+       else if(m->unixheader == nil){
                if(m->unixfrom && strcmp(m->unixfrom, "???") != 0)
                        p = m->unixfrom;
                else if(m->from)
index 59cb243bea3cd061308a4a34c9a718a8fefb8358..543bdc8f5da2cd78651abda82a22efb6b2926877 100644 (file)
@@ -22,24 +22,10 @@ slurp(char *f, char *b, uvlong o, long l)
        return r != l ? -1: 0;
 }
 
-static void
-parseunix(Message *m)
-{
-       char *s, *p;
-
-       m->unixheader = smprint("%.*s", utfnlen(m->start, m->header - m->start), m->start);
-       s = m->start + 5;
-       if((p = strchr(s, ' ')) == nil)
-               return;
-       *p = 0;
-       m->unixfrom = strdup(s);
-       *p = ' ';
-}
-
 static int
 mdirfetch(Mailbox *mb, Message *m, uvlong o, ulong l)
 {
-       char buf[Pathlen], *x;
+       char buf[Pathlen];
        Mdir *mdir;
 
        mdir = mb->aux;
@@ -51,17 +37,6 @@ mdirfetch(Mailbox *mb, Message *m, uvlong o, ulong l)
                mdprint(mdir, "%r\n");
                return -1;
        }
-       if(m->header == nil)
-               m->header = m->start;
-       if(m->header == m->start)
-       if(o + l >= 36)
-       if(strncmp(m->start, "From ", 5) == 0)
-       if(x = strchr(m->start, '\n')){
-               m->header = x + 1;
-               if(m->unixfrom == nil)
-                       parseunix(m);
-       }
-       m->mheader = m->mhend = m->header;
        mdprint(mdir, "fetched [%llud, %llud]\n", o, o + l);
        return 0;
 }
index aa8c676499d733f8b92cec5840e2658af58f5621..2c793b40a58da28d4a20c4db0f2fee6fb3b8ef2f 100644 (file)
@@ -50,29 +50,6 @@ chkunix(char *s, int n)
        return r;
 }
 
-static char*
-parseunix(Message *m)
-{
-       char *s, *p, *q;
-       Tm tm;
-
-       m->unixheader = smprint("%.*s", utfnlen(m->start, m->header - m->start), m->start);
-       s = m->start + 5;
-       if((p = strchr(s, ' ')) == nil)
-               return s;
-       *p = 0;
-       m->unixfrom = strdup(s);
-       *p++ = ' ';
-       if(q = strchr(p, '\n'))
-               *q = 0;
-       if(strtotm(p, &tm) < 0)
-               return p;
-       if(q)
-               *q = '\n';
-       m->fileid = (uvlong)tm2sec(&tm) << 8;
-       return 0;
-}
-
 static void
 addtomessage(Message *m, char *p, int n)
 {
@@ -215,7 +192,7 @@ mergemsg(Message *m, Message *x)
 static char*
 readmbox(Mailbox *mb, Mlock *lk)
 {
-       char *p, *x, buf[Pathlen];
+       char buf[Pathlen];
        Biobuf *in;
        Dir *d;
        Inbuf b;
@@ -306,12 +283,6 @@ retry:
                }
                if(m == nil)
                        continue;
-               m->header = m->end;
-               if(x = strchr(m->start, '\n'))
-                       m->header = x + 1;
-               if(p = parseunix(m))
-                       sysfatal("%s:%lld naked From in body? [%s]", mb->path, seek(Bfildes(in), 0, 1), p);
-               m->mheader = m->mhend = m->header;
                parse(mb, m, 0, 0);
                if(m != *l && m->deleted != Dup){
                        logmsg(m, "new");