Ticket #2014: patch-1.5.11cvs.tamovl.namequot.1

File patch-1.5.11cvs.tamovl.namequot.1, 9.8 kB (added by anonymous, 17 months ago)

patch-1.5.11cvs.tamovl.namequot.1

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