John Dennis 38f226
--- cyrus-imapd-2.2.6/imap/message.c.acceptinvalidfrom	2004-10-30 15:03:02.220642392 -0700
John Dennis 38f226
+++ cyrus-imapd-2.2.6/imap/message.c	2004-10-30 15:06:01.838336352 -0700
John Dennis 38f226
@@ -229,6 +229,8 @@
John Dennis 38f226
     int reject8bit = config_getswitch(IMAPOPT_REJECT8BIT);
John Dennis 38f226
     int munge8bit = config_getswitch(IMAPOPT_MUNGE8BIT);
John Dennis 38f226
     int inheader = 1, blankline = 1;
John Dennis 38f226
+    char is_from;
John Dennis 38f226
+    static const char * from_header = "From ";
John Dennis 38f226
 
John Dennis 38f226
     while (size) {
John Dennis 38f226
 	n = prot_read(from, buf, size > 4096 ? 4096 : size);
John Dennis 38f226
@@ -294,8 +296,20 @@
John Dennis 38f226
 	/* Check for valid header name */
John Dennis 38f226
 	if (sawnl && buf[0] != ' ' && buf[0] != '\t') {
John Dennis 38f226
 	    if (buf[0] == ':') return IMAP_MESSAGE_BADHEADER;
John Dennis 38f226
-	    for (p = (unsigned char *)buf; *p != ':'; p++) {
John Dennis 38f226
-		if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
John Dennis 38f226
+            p = (unsigned char *) buf;
John Dennis 38f226
+            if (*p == '>')
John Dennis 38f226
+                p++;
John Dennis 38f226
+            if (*p == from_header[0])
John Dennis 38f226
+                is_from = 0;
John Dennis 38f226
+            else
John Dennis 38f226
+                is_from = -1;
John Dennis 38f226
+            for (; *p != ':' && is_from < 5; p++) {
John Dennis 38f226
+                if (is_from > 0 && *p != from_header[is_from])
John Dennis 38f226
+                    is_from = -1;
John Dennis 38f226
+                if (is_from >= 0)
John Dennis 38f226
+                    is_from++;
John Dennis 38f226
+                else
John Dennis 38f226
+                    if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
John Dennis 38f226
 	    }
John Dennis 38f226
 	}
John Dennis 38f226