summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNigel Metheringham <nigel@exim.org>2011-01-30 15:50:46 +0000
committerNigel Metheringham <nigel@exim.org>2011-01-30 15:50:46 +0000
commit86ae49a65fce504ebcf9c30ddff213cca71fb872 (patch)
tree71409bb2be26a46fc93b13dbec04b2787a6dec6b /src
parent4ad401fb8100d20185c99aa00493e8bb49a53e45 (diff)
Fix wide character breakage in the rfc2047 coding
Fixes bug 1064 Patch frome Andrey N. Oktyabrski
Diffstat (limited to 'src')
-rw-r--r--src/src/parse.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/src/parse.c b/src/src/parse.c
index 09fcf98fe..805b443d5 100644
--- a/src/src/parse.c
+++ b/src/src/parse.c
@@ -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++ = '?';