ph10 2004/11/17 15:21:10 GMT
Modified files:
exim-doc/doc-txt ChangeLog
exim-src/src expand.c parse.c
exim-test-orig/AutoTest/scripts 082
exim-test-orig/AutoTest/stdout 082
Log:
Respect the 75-character limit for "encoded words" when doing RFC 2047
encoding, and increase the buffer size for ${rfc2047: expansion.
Revision Changes Path
1.30 +7 -0 exim/exim-doc/doc-txt/ChangeLog
1.5 +1 -1 exim/exim-src/src/expand.c
1.2 +28 -4 exim/exim-src/src/parse.c
1.3 +3 -0 exim/exim-test-orig/AutoTest/scripts/082
1.3 +3 -0 exim/exim-test-orig/AutoTest/stdout/082
Index: ChangeLog
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- ChangeLog 17 Nov 2004 14:32:25 -0000 1.29
+++ ChangeLog 17 Nov 2004 15:21:10 -0000 1.30
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.29 2004/11/17 14:32:25 ph10 Exp $
+$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.30 2004/11/17 15:21:10 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -121,6 +121,13 @@
function that finds that data and another that does the check. The former
is then used to implement four new variables: $spool_space, $log_space,
$spool_inodes, and $log_inodes.
+
+32. The RFC2047 encoding function was originally intended for short strings
+ such as real names; it was not keeping to the 75-character limit for
+ encoded words that the RFC imposes. It now respects the limit, and
+ generates multiple encoded words if necessary. To be on the safe side, I
+ have increased the buffer size for the ${rfc2047: expansion operator from
+ 1024 to 2048 bytes.
Exim version 4.43
Index: expand.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/expand.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- expand.c 17 Nov 2004 14:32:25 -0000 1.4
+++ expand.c 17 Nov 2004 15:21:10 -0000 1.5
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/expand.c,v 1.4 2004/11/17 14:32:25 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/expand.c,v 1.5 2004/11/17 15:21:10 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -4083,7 +4083,7 @@
case EOP_RFC2047:
{
- uschar buffer[1024];
+ uschar buffer[2048];
uschar *string = parse_quote_2047(sub, Ustrlen(sub), headers_charset,
buffer, sizeof(buffer));
yield = string_cat(yield, &size, &ptr, string, Ustrlen(string));
Index: parse.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/parse.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- parse.c 7 Oct 2004 10:39:01 -0000 1.1
+++ parse.c 17 Nov 2004 15:21:10 -0000 1.2
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/parse.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/parse.c,v 1.2 2004/11/17 15:21:10 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -847,6 +847,11 @@
original string, unmodified. If a quoted string is too long for the buffer, it
is truncated. (This shouldn't happen: this is normally handling short strings.)
+Hmmph. As always, things get perverted for other uses. This function was
+originally for the "phrase" part of addresses. Now it is being used for much
+longer texts in ACLs and via the ${rfc2047: expansion item. This means we have
+to check for overlong "encoded-word"s and split them. November 2004.
+
Arguments:
string the string to quote - already checked to contain non-printing
chars
@@ -866,7 +871,8 @@
int buffer_size)
{
uschar *s = string;
-uschar *t;
+uschar *p, *t;
+int hlen;
BOOL coded = FALSE;
if (charset == NULL) charset = US"iso-8859-1";
@@ -876,11 +882,25 @@
if (!string_format(buffer, buffer_size, "=?%s?Q?", charset))
return US"String too long";
-t = buffer + Ustrlen(buffer);
+hlen = Ustrlen(buffer);
+t = buffer + hlen;
+p = buffer;
+
for (; len > 0; len--)
{
int ch = *s++;
- if (t > buffer + buffer_size - 8) break;
+ if (t > buffer + buffer_size - hlen - 8) break;
+
+ if (t - p > 70)
+ {
+ *t++ = '?';
+ *t++ = '=';
+ *t++ = ' ';
+ p = t;
+ Ustrncpy(p, buffer, hlen);
+ t += hlen;
+ }
+
if (ch < 33 || ch > 126 ||
Ustrchr("?=()<>@,;:\\\".[]_", ch) != NULL)
{
@@ -893,7 +913,11 @@
}
else *t++ = ch;
}
-sprintf(CS t, "?=");
+
+*t++ = '?';
+*t++ = '=';
+*t = 0;
+
return coded? buffer : string;
}
Index: 082
===================================================================
RCS file: /home/cvs/exim/exim-test-orig/AutoTest/scripts/082,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- 082 14 Oct 2004 11:16:36 -0000 1.2
+++ 082 17 Nov 2004 15:21:10 -0000 1.3
@@ -481,6 +481,9 @@
abcd ${rfc2047:abcd}
<:abcd:> ${rfc2047:<:abcd:>}
<:ab cd:> ${rfc2047:<:ab cd:>}
+Long: ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit}
+Long: ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit by a long way; in fact this one will go over the 150 character limit}
+
# UTF-8
Index: 082
===================================================================
RCS file: /home/cvs/exim/exim-test-orig/AutoTest/stdout/082,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- 082 14 Oct 2004 11:16:36 -0000 1.2
+++ 082 17 Nov 2004 15:21:10 -0000 1.3
@@ -477,6 +477,9 @@
> abcd abcd
> <:abcd:> =?iso-8859-8?Q?=3C=3Aabcd=3A=3E?=
> <:ab cd:> =?iso-8859-8?Q?=3C=3Aab_cd=3A=3E?=
+> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit?=
+> Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit_by_a_long_way=3B_in_fac?= =?iso-8859-8?Q?t_this_one_will_go_over_the_150_character_limit?=
+>
>
> # UTF-8
>