diff -r 1e1c7c437979 -r 1482d7450916 copy.c --- a/copy.c Mon Sep 19 06:22:55 2005 +++ b/copy.c Mon Sep 19 12:23:52 2005 @@ -982,6 +982,7 @@ if ((a = rfc822_parse_adrlist (a, s + l)) == NULL) return 0; + rfc822_dequotepersonal_adrlist (a); mutt_addrlist_to_local (a); rfc2047_decode_adrlist (a); diff -r 1e1c7c437979 -r 1482d7450916 hdrline.c --- a/hdrline.c Mon Sep 19 06:22:55 2005 +++ b/hdrline.c Mon Sep 19 12:23:52 2005 @@ -59,7 +59,11 @@ if (mutt_is_subscribed_list (adr)) { if (pfx && buf && buflen) - snprintf (buf, buflen, "%s%s", pfx, mutt_get_name (adr)); + { + const char *name = mutt_get_name (adr); + snprintf (buf, buflen, "%s%s", pfx, name); + FREE (&name); + } return 1; } } @@ -102,6 +106,7 @@ static void make_from (ENVELOPE *hdr, char *buf, size_t len, int do_lists) { int me; + const char *name = NULL; me = mutt_addr_is_user (hdr->from); @@ -114,13 +119,16 @@ } if (me && hdr->to) - snprintf (buf, len, "To %s", mutt_get_name (hdr->to)); + snprintf (buf, len, "To %s", name = mutt_get_name (hdr->to)); else if (me && hdr->cc) - snprintf (buf, len, "Cc %s", mutt_get_name (hdr->cc)); + snprintf (buf, len, "Cc %s", name = mutt_get_name (hdr->cc)); else if (hdr->from) - strfcpy (buf, mutt_get_name (hdr->from), len); + strfcpy (buf, name = mutt_get_name (hdr->from), len); else *buf = 0; + + if (name) + FREE (&name); } static void make_from_addr (ENVELOPE *hdr, char *buf, size_t len, int do_lists) @@ -492,7 +500,11 @@ break; case 'n': - mutt_format_s (dest, destlen, prefix, mutt_get_name (hdr->env->from)); + { + const char *name = mutt_get_name (hdr->env->from); + mutt_format_s (dest, destlen, prefix, name); + FREE (&name); + } break; case 'N': @@ -587,10 +599,13 @@ if (!check_for_mailing_list (hdr->env->to, "To ", buf2, sizeof (buf2)) && !check_for_mailing_list (hdr->env->cc, "Cc ", buf2, sizeof (buf2))) { + const char *name = NULL; if (hdr->env->to) - snprintf (buf2, sizeof (buf2), "To %s", mutt_get_name (hdr->env->to)); + snprintf (buf2, sizeof (buf2), "To %s", name = mutt_get_name (hdr->env->to)); else if (hdr->env->cc) - snprintf (buf2, sizeof (buf2), "Cc %s", mutt_get_name (hdr->env->cc)); + snprintf (buf2, sizeof (buf2), "Cc %s", name = mutt_get_name (hdr->env->cc)); + if (name) + FREE (&name); } mutt_format_s (dest, destlen, prefix, buf2); break; @@ -616,15 +631,22 @@ case 'v': if (mutt_addr_is_user (hdr->env->from)) { + const char *name = NULL; if (hdr->env->to) - mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->to)); + mutt_format_s (buf2, sizeof (buf2), prefix, name = mutt_get_name (hdr->env->to)); else if (hdr->env->cc) - mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->cc)); + mutt_format_s (buf2, sizeof (buf2), prefix, name = mutt_get_name (hdr->env->cc)); else *buf2 = 0; - } - else - mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->from)); + if (name) + FREE (&name); + } + else + { + const char *name = mutt_get_name (hdr->env->from); + mutt_format_s (buf2, sizeof (buf2), prefix, name); + FREE (&name); + } if ((p = strpbrk (buf2, " %@"))) *p = 0; mutt_format_s (dest, destlen, prefix, buf2); diff -r 1e1c7c437979 -r 1482d7450916 rfc822.c --- a/rfc822.c Mon Sep 19 06:22:55 2005 +++ b/rfc822.c Mon Sep 19 12:23:52 2005 @@ -60,28 +60,6 @@ "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) { ADDRESS *t; @@ -119,6 +97,8 @@ } else if (*s == '\\') { + if (*commentlen < commentmax) + comment[(*commentlen)++] = *s; if (!*++s) break; } @@ -153,8 +133,8 @@ if (!*++s) break; - if (*tokenlen < tokenmax) - token[*tokenlen] = *s; + if (*tokenlen + 1 < tokenmax) + token[++(*tokenlen)] = *s; } (*tokenlen)++; s++; @@ -451,9 +431,7 @@ { 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) { @@ -531,11 +509,6 @@ *pc++ = '"'; for (; *value && tmplen > 1; value++) { - if (*value == '\\' || *value == '"') - { - *pc++ = '\\'; - tmplen--; - } *pc++ = *value; tmplen--; } @@ -552,7 +525,6 @@ { size_t len; char *pbuf = buf; - char *pc; if (!addr) return; @@ -582,40 +554,12 @@ if (addr->personal) { - if (strpbrk (addr->personal, RFC822Specials)) - { - if (!buflen) - goto done; - *pbuf++ = '"'; - buflen--; - for (pc = addr->personal; *pc && buflen > 0; pc++) - { - if (*pc == '"' || *pc == '\\') - { - if (!buflen) - goto done; - *pbuf++ = '\\'; - buflen--; - } - if (!buflen) - goto done; - *pbuf++ = *pc; - buflen--; - } - if (!buflen) - goto done; - *pbuf++ = '"'; - buflen--; - } - else - { - if (!buflen) - goto done; - strfcpy (pbuf, addr->personal, buflen); - len = mutt_strlen (pbuf); - pbuf += len; - buflen -= len; - } + if (!buflen) + goto done; + strfcpy (pbuf, addr->personal, buflen); + len = mutt_strlen (pbuf); + pbuf += len; + buflen -= len; if (!buflen) goto done; @@ -791,6 +735,41 @@ return tmp; } +/* dequote personal name */ +char *rfc822_dequote_personal (char **s) +{ + if (*s && **s) + { + size_t slen = mutt_strlen (*s); + char *r = safe_malloc (slen + 1); + char *p = *s, *q = r; + if (slen > 2 && **s == '"' && *(*s + slen - 1) == '"') + { + p++; + slen--; + } + for (; p < *s + slen; p++) + { + if (*p == '\\') + *q++ = *++p; + else + *q++ = *p; + } + *q = 0; + FREE (s); + *s = r; + } + return (*s); +} + +/* dequote personal names in adrlist */ +void rfc822_dequotepersonal_adrlist (ADDRESS *a) +{ + ADDRESS *cur = a; + for (; cur; cur = cur->next) + rfc822_dequote_personal (&cur->personal); +} + #ifdef TESTING int safe_free (void **p) { diff -r 1e1c7c437979 -r 1482d7450916 rfc822.h --- a/rfc822.h Mon Sep 19 06:22:55 2005 +++ b/rfc822.h Mon Sep 19 12:23:52 2005 @@ -52,6 +52,8 @@ void rfc822_write_address_single (char *, size_t, ADDRESS *, int); void rfc822_free_address (ADDRESS **addr); void rfc822_cat (char *, size_t, const char *, const char *); +char *rfc822_dequote_personal (char **); +void rfc822_dequotepersonal_adrlist (ADDRESS *); extern int RFC822Error; extern const char *RFC822Errors[]; diff -r 1e1c7c437979 -r 1482d7450916 sort.c --- a/sort.c Mon Sep 19 06:22:55 2005 +++ b/sort.c Mon Sep 19 12:23:52 2005 @@ -90,21 +90,25 @@ return (SORTCODE (rc)); } +/* needs freeing */ const char *mutt_get_name (ADDRESS *a) { ADDRESS *ali; + char *tmp = NULL; if (a) { if (option (OPTREVALIAS) && (ali = alias_reverse_lookup (a)) && ali->personal) - return ali->personal; + tmp = safe_strdup (ali->personal); else if (a->personal) - return a->personal; + tmp = safe_strdup (a->personal); else if (a->mailbox) - return (mutt_addr_for_display (a)); + tmp = safe_strdup (mutt_addr_for_display (a)); + if (tmp) + return (rfc822_dequote_personal (&tmp)); } /* don't return NULL to avoid segfault when printing/comparing */ - return (""); + return (safe_strdup("")); } int compare_to (const void *a, const void *b) @@ -117,6 +121,8 @@ fa = mutt_get_name ((*ppa)->env->to); fb = mutt_get_name ((*ppb)->env->to); result = mutt_strcasecmp (fa, fb); + FREE (&fa); + FREE (&fb); AUXSORT(result,a,b); return (SORTCODE (result)); } @@ -131,6 +137,8 @@ fa = mutt_get_name ((*ppa)->env->from); fb = mutt_get_name ((*ppb)->env->from); result = mutt_strcasecmp (fa, fb); + FREE (&fa); + FREE (&fb); AUXSORT(result,a,b); return (SORTCODE (result)); }