git://git.exim.org
/
users
/
jgh
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix wide character breakage in the rfc2047 coding
[users/jgh/exim.git]
/
src
/
src
/
parse.c
diff --git
a/src/src/parse.c
b/src/src/parse.c
index 09fcf98fe98f3e6a1041dab8840fa3e1011b75fa..805b443d52eac770e4a92725cbe36581bce84c67 100644
(file)
--- 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;
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++ = '?';