Ticket #2014: patch-1.5.11.tamo.namequot.3

File patch-1.5.11.tamo.namequot.3, 8.3 kB (added by anonymous, 17 months ago)

patch-1.5.11.tamo.namequot.3

Line 
1diff -r 1e1c7c437979 -r 1482d7450916 copy.c
2--- a/copy.c    Mon Sep 19 06:22:55 2005
3+++ b/copy.c    Mon Sep 19 12:23:52 2005
4@@ -982,6 +982,7 @@
5   if ((a = rfc822_parse_adrlist (a, s + l)) == NULL)
6     return 0;
7   
8+  rfc822_dequotepersonal_adrlist (a);
9   mutt_addrlist_to_local (a);
10   rfc2047_decode_adrlist (a);
11   
12diff -r 1e1c7c437979 -r 1482d7450916 hdrline.c
13--- a/hdrline.c Mon Sep 19 06:22:55 2005
14+++ b/hdrline.c Mon Sep 19 12:23:52 2005
15@@ -59,7 +59,11 @@
16     if (mutt_is_subscribed_list (adr))
17     {
18       if (pfx && buf && buflen)
19-       snprintf (buf, buflen, "%s%s", pfx, mutt_get_name (adr));
20+      {
21+       const char *name = mutt_get_name (adr);
22+       snprintf (buf, buflen, "%s%s", pfx, name);
23+       FREE (&name);
24+      }
25       return 1;
26     }
27   }
28@@ -102,6 +106,7 @@
29 static void make_from (ENVELOPE *hdr, char *buf, size_t len, int do_lists)
30 {
31   int me;
32+  const char *name = NULL;
33 
34   me = mutt_addr_is_user (hdr->from);
35 
36@@ -114,13 +119,16 @@
37   }
38 
39   if (me && hdr->to)
40-    snprintf (buf, len, "To %s", mutt_get_name (hdr->to));
41+    snprintf (buf, len, "To %s", name = mutt_get_name (hdr->to));
42   else if (me && hdr->cc)
43-    snprintf (buf, len, "Cc %s", mutt_get_name (hdr->cc));
44+    snprintf (buf, len, "Cc %s", name = mutt_get_name (hdr->cc));
45   else if (hdr->from)
46-    strfcpy (buf, mutt_get_name (hdr->from), len);
47+    strfcpy (buf, name = mutt_get_name (hdr->from), len);
48   else
49     *buf = 0;
50+
51+  if (name)
52+    FREE (&name);
53 }
54 
55 static void make_from_addr (ENVELOPE *hdr, char *buf, size_t len, int do_lists)
56@@ -492,7 +500,11 @@
57       break;
58 
59     case 'n':
60-      mutt_format_s (dest, destlen, prefix, mutt_get_name (hdr->env->from));
61+      {
62+       const char *name = mutt_get_name (hdr->env->from);
63+       mutt_format_s (dest, destlen, prefix, name);
64+       FREE (&name);
65+      }
66       break;
67 
68     case 'N':
69@@ -587,10 +599,13 @@
70       if (!check_for_mailing_list (hdr->env->to, "To ", buf2, sizeof (buf2)) &&
71          !check_for_mailing_list (hdr->env->cc, "Cc ", buf2, sizeof (buf2)))
72       {
73+       const char *name = NULL;
74        if (hdr->env->to)
75-         snprintf (buf2, sizeof (buf2), "To %s", mutt_get_name (hdr->env->to));
76+         snprintf (buf2, sizeof (buf2), "To %s", name = mutt_get_name (hdr->env->to));
77        else if (hdr->env->cc)
78-         snprintf (buf2, sizeof (buf2), "Cc %s", mutt_get_name (hdr->env->cc));
79+         snprintf (buf2, sizeof (buf2), "Cc %s", name = mutt_get_name (hdr->env->cc));
80+       if (name)
81+         FREE (&name);
82       }
83       mutt_format_s (dest, destlen, prefix, buf2);
84       break;
85@@ -616,15 +631,22 @@
86     case 'v':
87       if (mutt_addr_is_user (hdr->env->from))
88       {
89+       const char *name = NULL;
90        if (hdr->env->to)
91-         mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->to));
92+         mutt_format_s (buf2, sizeof (buf2), prefix, name = mutt_get_name (hdr->env->to));
93        else if (hdr->env->cc)
94-         mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->cc));
95+         mutt_format_s (buf2, sizeof (buf2), prefix, name = mutt_get_name (hdr->env->cc));
96        else
97          *buf2 = 0;
98-      }
99-      else
100-       mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->from));
101+       if (name)
102+         FREE (&name);
103+      }
104+      else
105+      {
106+       const char *name = mutt_get_name (hdr->env->from);
107+       mutt_format_s (buf2, sizeof (buf2), prefix, name);
108+       FREE (&name);
109+      }
110       if ((p = strpbrk (buf2, " %@")))
111        *p = 0;
112       mutt_format_s (dest, destlen, prefix, buf2);
113diff -r 1e1c7c437979 -r 1482d7450916 rfc822.c
114--- a/rfc822.c  Mon Sep 19 06:22:55 2005
115+++ b/rfc822.c  Mon Sep 19 12:23:52 2005
116@@ -60,28 +60,6 @@
117   "bad address spec"
118 };
119 
120-void rfc822_dequote_comment (char *s)
121-{
122-  char *w = s;
123-
124-  for (; *s; s++)
125-  {
126-    if (*s == '\\')
127-    {
128-      if (!*++s)
129-       break; /* error? */
130-      *w++ = *s;
131-    }
132-    else if (*s != '\"')
133-    {
134-      if (w != s)
135-       *w = *s;
136-      w++;
137-    }
138-  }
139-  *w = 0;
140-}
141-
142 void rfc822_free_address (ADDRESS **p)
143 {
144   ADDRESS *t;
145@@ -119,6 +97,8 @@
146     }
147     else if (*s == '\\')
148     {
149+      if (*commentlen < commentmax)
150+       comment[(*commentlen)++] = *s;
151       if (!*++s)
152        break;
153     }
154@@ -153,8 +133,8 @@
155       if (!*++s)
156        break;
157 
158-      if (*tokenlen < tokenmax)
159-       token[*tokenlen] = *s;
160+      if (*tokenlen + 1 < tokenmax)
161+       token[++(*tokenlen)] = *s;
162     }
163     (*tokenlen)++;
164     s++;
165@@ -451,9 +431,7 @@
166       {
167        if (cur->personal)
168          FREE (&cur->personal);
169-       /* if we get something like "Michael R. Elkins" remove the quotes */
170-       rfc822_dequote_comment (phrase);
171-       cur->personal = safe_strdup (phrase);
172+         cur->personal = safe_strdup (phrase);
173       }
174       if ((ps = parse_route_addr (s + 1, comment, &commentlen, sizeof (comment) - 1, cur)) == NULL)
175       {
176@@ -531,11 +509,6 @@
177     *pc++ = '"';
178     for (; *value && tmplen > 1; value++)
179     {
180-      if (*value == '\\' || *value == '"')
181-      {
182-       *pc++ = '\\';
183-       tmplen--;
184-      }
185       *pc++ = *value;
186       tmplen--;
187     }
188@@ -552,7 +525,6 @@
189 {
190   size_t len;
191   char *pbuf = buf;
192-  char *pc;
193   
194   if (!addr)
195     return;
196@@ -582,40 +554,12 @@
197 
198   if (addr->personal)
199   {
200-    if (strpbrk (addr->personal, RFC822Specials))
201-    {
202-      if (!buflen)
203-       goto done;
204-      *pbuf++ = '"';
205-      buflen--;
206-      for (pc = addr->personal; *pc && buflen > 0; pc++)
207-      {
208-       if (*pc == '"' || *pc == '\\')
209-       {
210-         if (!buflen)
211-           goto done;
212-         *pbuf++ = '\\';
213-         buflen--;
214-       }
215-       if (!buflen)
216-         goto done;
217-       *pbuf++ = *pc;
218-       buflen--;
219-      }
220-      if (!buflen)
221-       goto done;
222-      *pbuf++ = '"';
223-      buflen--;
224-    }
225-    else
226-    {
227-      if (!buflen)
228-       goto done;
229-      strfcpy (pbuf, addr->personal, buflen);
230-      len = mutt_strlen (pbuf);
231-      pbuf += len;
232-      buflen -= len;
233-    }
234+    if (!buflen)
235+      goto done;
236+    strfcpy (pbuf, addr->personal, buflen);
237+    len = mutt_strlen (pbuf);
238+    pbuf += len;
239+    buflen -= len;
240 
241     if (!buflen)
242       goto done;
243@@ -791,6 +735,41 @@
244   return tmp;
245 }
246 
247+/* dequote personal name */
248+char *rfc822_dequote_personal (char **s)
249+{
250+  if (*s && **s)
251+  {
252+    size_t slen = mutt_strlen (*s);
253+    char *r = safe_malloc (slen + 1);
254+    char *p = *s, *q = r;
255+    if (slen > 2 && **s == '"' && *(*s + slen - 1) == '"')
256+    {
257+      p++;
258+      slen--;
259+    }
260+    for (; p < *s + slen; p++)
261+    {
262+      if (*p == '\\')
263+        *q++ = *++p;
264+      else
265+        *q++ = *p;
266+    }
267+    *q = 0;
268+    FREE (s);
269+    *s = r;
270+  }
271+  return (*s);
272+}
273+
274+/* dequote personal names in adrlist */
275+void rfc822_dequotepersonal_adrlist (ADDRESS *a)
276+{
277+  ADDRESS *cur = a;
278+  for (; cur; cur = cur->next)
279+    rfc822_dequote_personal (&cur->personal);
280+}
281+
282 #ifdef TESTING
283 int safe_free (void **p)
284 {
285diff -r 1e1c7c437979 -r 1482d7450916 rfc822.h
286--- a/rfc822.h  Mon Sep 19 06:22:55 2005
287+++ b/rfc822.h  Mon Sep 19 12:23:52 2005
288@@ -52,6 +52,8 @@
289 void rfc822_write_address_single (char *, size_t, ADDRESS *, int);
290 void rfc822_free_address (ADDRESS **addr);
291 void rfc822_cat (char *, size_t, const char *, const char *);
292+char *rfc822_dequote_personal (char **);
293+void rfc822_dequotepersonal_adrlist (ADDRESS *);
294 
295 extern int RFC822Error;
296 extern const char *RFC822Errors[];
297diff -r 1e1c7c437979 -r 1482d7450916 sort.c
298--- a/sort.c    Mon Sep 19 06:22:55 2005
299+++ b/sort.c    Mon Sep 19 12:23:52 2005
300@@ -90,21 +90,25 @@
301   return (SORTCODE (rc));
302 }
303 
304+/* needs freeing */
305 const char *mutt_get_name (ADDRESS *a)
306 {
307   ADDRESS *ali;
308+  char *tmp = NULL;
309 
310   if (a)
311   {
312     if (option (OPTREVALIAS) && (ali = alias_reverse_lookup (a)) && ali->personal)
313-      return ali->personal;
314+      tmp = safe_strdup (ali->personal);
315     else if (a->personal)
316-      return a->personal;
317+      tmp = safe_strdup (a->personal);
318     else if (a->mailbox)
319-      return (mutt_addr_for_display (a));
320+      tmp = safe_strdup (mutt_addr_for_display (a));
321+    if (tmp)
322+      return (rfc822_dequote_personal (&tmp));
323   }
324   /* don't return NULL to avoid segfault when printing/comparing */
325-  return ("");
326+  return (safe_strdup(""));
327 }
328 
329 int compare_to (const void *a, const void *b)
330@@ -117,6 +121,8 @@
331   fa = mutt_get_name ((*ppa)->env->to);
332   fb = mutt_get_name ((*ppb)->env->to);
333   result = mutt_strcasecmp (fa, fb);
334+  FREE (&fa);
335+  FREE (&fb);
336   AUXSORT(result,a,b);
337   return (SORTCODE (result));
338 }
339@@ -131,6 +137,8 @@
340   fa = mutt_get_name ((*ppa)->env->from);
341   fb = mutt_get_name ((*ppb)->env->from);
342   result = mutt_strcasecmp (fa, fb);
343+  FREE (&fa);
344+  FREE (&fb);
345   AUXSORT(result,a,b);
346   return (SORTCODE (result));
347 }