Fix wide character breakage in the rfc2047 coding
authorNigel Metheringham <nigel@exim.org>
Sun, 30 Jan 2011 15:50:46 +0000 (15:50 +0000)
committerNigel Metheringham <nigel@exim.org>
Sun, 30 Jan 2011 15:50:46 +0000 (15:50 +0000)
Fixes bug 1064
Patch frome Andrey N. Oktyabrski

src/src/parse.c

index 09fcf98fe98f3e6a1041dab8840fa3e1011b75fa..805b443d52eac770e4a92725cbe36581bce84c67 100644 (file)
@@ -876,6 +876,7 @@ uschar *s = string;
 uschar *p, *t;
 int hlen;
 BOOL coded = FALSE;
 uschar *p, *t;
 int hlen;
 BOOL coded = FALSE;
+BOOL first_byte = FALSE;
 
 if (charset == NULL) charset = US"iso-8859-1";
 
 
 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;
 
   int ch = *s++;
   if (t > buffer + buffer_size - hlen - 8) break;
 
-  if (t - p > 70)
+  if ((t - p > 67) && !first_byte)
     {
     *t++ = '?';
     *t++ = '=';
     {
     *t++ = '?';
     *t++ = '=';
@@ -907,14 +908,20 @@ for (; len > 0; len--)
   if (ch < 33 || ch > 126 ||
       Ustrchr("?=()<>@,;:\\\".[]_", ch) != NULL)
     {
   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;
       {
       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++ = '?';
   }
 
 *t++ = '?';