from.c | 28 ++++++++++++++++++++-------- rfc822.c | 6 ++++++ 2 files changed, 26 insertions(+), 8 deletions(-)
# HG changeset patch # User David Champion <d...@uchicago.edu> # Date 1273031552 18000 # Branch HEAD # Node ID 850072857e7c86e29a73efc3478b2feabbe01394 # Parent 4cd2daafd03bfe9d8af1fa543baf873cd94e144f Adequately read mailboxes with s/@/ at / obfuscations. This handles mbox From_ separators and rfc822 address parsing. diff -r 4cd2daafd03b -r 850072857e7c from.c --- a/from.c Sat Apr 24 16:10:43 2010 -0700 +++ b/from.c Tue May 04 22:52:32 2010 -0500 @@ -83,20 +83,32 @@ const char *p; size_t len; short q = 0; + short at = 0; - for (p = s; *p && (q || !ISSPACE (*p)); p++) + p = s; + do { - if (*p == '\\') + for ( ; *p && (q || !ISSPACE (*p)); p++) { - if (*++p == '\0') - return 0; + if (*p == '\\') + { + if (*++p == '\0') + return 0; + } + else if (*p == '"') + { + q = !q; + } } - else if (*p == '"') + + at = 0; + if (!strncasecmp(p, " at ", 4)) { - q = !q; + at = 1; + p += 4; } - } - + } while (at); + if (q || !*p) return 0; if (path) diff -r 4cd2daafd03b -r 850072857e7c rfc822.c --- a/rfc822.c Sat Apr 24 16:10:43 2010 -0700 +++ b/rfc822.c Tue May 04 22:52:32 2010 -0500 @@ -245,6 +245,12 @@ ps = next_token (s, mailbox, mailboxlen, mailboxmax); if (!ps) return NULL; + if (!strncasecmp(ps, " at ", 4)) + { + if (*mailboxlen < mailboxmax) + mailbox[(*mailboxlen)++] = '@'; + ps += 4; + } s = ps; }