]> Pileus Git - ~andy/fetchmail/blobdiff - rfc822.c
Thomas Pitre's multidrop enhancements.
[~andy/fetchmail] / rfc822.c
index a41e14a38e59e6d95c73570a60edcabd234f65e4..9bb10b0055353147d628d5ed6f0a8972702deb7d 100644 (file)
--- a/rfc822.c
+++ b/rfc822.c
@@ -34,7 +34,16 @@ const char *host;    /* server hostname */
        && strncasecmp("Reply-To: ", buf, 10)
        && strncasecmp("Return-Path: ", buf, 13)
        && strncasecmp("Cc: ", buf, 4)
-       && strncasecmp("Bcc: ", buf, 5)) {
+       && strncasecmp("Bcc: ", buf, 5)
+       && strncasecmp("Resent-From: ", buf, 13)
+       && strncasecmp("Resent-To: ", buf, 11)
+       && strncasecmp("Resent-Cc: ", buf, 11)
+       && strncasecmp("Resent-Bcc: ", buf, 12)
+       && strncasecmp("Apparently-From:", buf, 16)
+       && strncasecmp("Apparently-To:", buf, 14)
+       && strncasecmp("Sender:", buf, 7)
+       && strncasecmp("Resent_Sender:", buf, 14)
+       ) {
        return(buf);
     }
 
@@ -43,9 +52,17 @@ const char *host;    /* server hostname */
     for (cp = buf; *cp; cp++)
        if (*cp == ',' || isspace(*cp))
            addresscount++;
-    buf = (char *)realloc(buf, strlen(buf) + addresscount * strlen(host) + 1);
+    buf = (char *)xrealloc(buf, strlen(buf) + addresscount * strlen(host) + 1);
 #endif /* TESTMAIN */
 
+    /*
+     * This is going to foo up on some ill-formed addresses.  For example,
+     * "From: John Smith (Systems) <jsmith@domain>" will get rewritten as 
+     * "From: John Smith@my.pop.server (Systems) <jsmith@domain>" because
+     * the state machine can't look ahead to the <> part past the comment
+     * and instead treats `John Smith' as a bareword address.
+     */
+
     parendepth = state = 0;
     has_host_part = has_bare_name_part = FALSE;
     for (from = buf; *from; from++)
@@ -88,7 +105,7 @@ const char *host;    /* server hostname */
                else if ((*from == ',' || HEADER_END(from) || from[1] == '(')
                         && has_bare_name_part
                         && !has_host_part
-                        && last_nws != ';')
+                        && last_nws != ';' && last_nws != ')')
                {
                    int hostlen;