diff -r e3c465918417 rfc822.c --- a/rfc822.c Fri Jul 25 19:24:22 2008 +0200 +++ b/rfc822.c Sun Jul 27 21:51:06 2008 +0900 @@ -59,28 +59,6 @@ const char *RFC822Errors[] = { "bad address in <>", "bad address spec" }; - -void rfc822_dequote_comment (char *s) -{ - char *w = s; - - for (; *s; s++) - { - if (*s == '\\') - { - if (!*++s) - break; /* error? */ - *w++ = *s; - } - else if (*s != '\"') - { - if (w != s) - *w = *s; - w++; - } - } - *w = 0; -} void rfc822_free_address (ADDRESS **p) { @@ -137,17 +115,10 @@ static const char * static const char * parse_quote (const char *s, char *token, size_t *tokenlen, size_t tokenmax) { - if (*tokenlen < tokenmax) - token[(*tokenlen)++] = '"'; while (*s) { if (*tokenlen < tokenmax) token[*tokenlen] = *s; - if (*s == '"') - { - (*tokenlen)++; - return (s + 1); - } if (*s == '\\') { if (!*++s) @@ -156,6 +127,8 @@ parse_quote (const char *s, char *token, if (*tokenlen < tokenmax) token[*tokenlen] = *s; } + else if (*s == '"') + return (s + 1); (*tokenlen)++; s++; } @@ -391,6 +364,17 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * } s = ps; } + else if (*s == '"') + { + if (phraselen && phraselen < sizeof (phrase) - 1) + phrase[phraselen++] = ' '; + if ((ps = parse_quote (s + 1, phrase, &phraselen, sizeof (phrase) - 1)) == NULL) + { + rfc822_free_address (&top); + return NULL; + } + s = ps; + } else if (*s == ':') { cur = rfc822_new_address (); @@ -453,9 +437,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * { if (cur->personal) FREE (&cur->personal); - /* if we get something like "Michael R. Elkins" remove the quotes */ - rfc822_dequote_comment (phrase); - cur->personal = safe_strdup (phrase); + cur->personal = safe_strdup (phrase); } if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL) {