Bugzilla #1106: Don't pass DKIM compound log line as format string
[exim.git] / src / src / parse.c
index f83ce14ac7abd293627ab0cb9c4e9b21cde0bb8f..805b443d52eac770e4a92725cbe36581bce84c67 100644 (file)
@@ -1,10 +1,10 @@
-/* $Cambridge: exim/src/src/parse.c,v 1.12 2008/06/04 13:29:34 michael Exp $ */
+/* $Cambridge: exim/src/src/parse.c,v 1.15 2009/11/16 19:50:37 nm4 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2007 */
+/* Copyright (c) University of Cambridge 1995 - 2009 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions for parsing addresses */
@@ -876,6 +876,7 @@ uschar *s = string;
 uschar *p, *t;
 int hlen;
 BOOL coded = FALSE;
+BOOL first_byte = FALSE;
 
 if (charset == NULL) charset = US"iso-8859-1";
 
@@ -893,7 +894,7 @@ for (; len > 0; len--)
   int ch = *s++;
   if (t > buffer + buffer_size - hlen - 8) break;
 
-  if (t - p > 70)
+  if ((t - p > 67) && !first_byte)
     {
     *t++ = '?';
     *t++ = '=';
@@ -907,14 +908,20 @@ for (; len > 0; len--)
   if (ch < 33 || ch > 126 ||
       Ustrchr("?=()<>@,;:\\\".[]_", ch) != NULL)
     {
-    if (ch == ' ') *t++ = '_'; else
+    if (ch == ' ')
+      {
+      *t++ = '_';
+      first_byte = FALSE;
+      } 
+    else
       {
       sprintf(CS t, "=%02X", ch);
       while (*t != 0) t++;
       coded = TRUE;
+      first_byte = !first_byte;
       }
     }
-  else *t++ = ch;
+  else { *t++ = ch; first_byte = FALSE; }
   }
 
 *t++ = '?';
@@ -1775,8 +1782,7 @@ day-name        =       "Mon" / "Tue" / "Wed" / "Thu" /
 obs-day-of-week =       [CFWS] day-name [CFWS]
 */
 
-uschar *o;
-static const uschar *day_name[7]={ "mon", "tue", "wed", "thu", "fri", "sat", "sun" };
+static const uschar *day_name[7]={ US"mon", US"tue", US"wed", US"thu", US"fri", US"sat", US"sun" };
 int i;
 uschar day[4];
 
@@ -1787,7 +1793,7 @@ for (i=0; i<3; ++i)
   ++str;
   }
 day[3]='\0';
-for (i=0; i<7; ++i) if (strcmp(day,day_name[i])==0) break;
+for (i=0; i<7; ++i) if (Ustrcmp(day,day_name[i])==0) break;
 if (i==7) return NULL;
 str=skip_comment(str);
 return str;
@@ -1834,7 +1840,7 @@ obs-day         =       [CFWS] 1*2DIGIT [CFWS]
 */
 
 uschar *c,*n;
-static const uschar *month_name[]={ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" };
+static const uschar *month_name[]={ US"jan", US"feb", US"mar", US"apr", US"may", US"jun", US"jul", US"aug", US"sep", US"oct", US"nov", US"dec" };
 int i;
 uschar month[4];
 
@@ -2010,9 +2016,11 @@ extern char **environ;
 char **old_environ;
 static char gmt0[]="TZ=GMT0";
 static char *gmt_env[]={ gmt0, (char*)0 };
+uschar *try;
 
-if (str=parse_day_of_week(str))
+if ((try=parse_day_of_week(str)))
   {
+  str=try;
   if (*str!=',') return 0;
   ++str;
   }