summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2014-08-17 19:10:36 +0100
committerJeremy Harris <jgh146exb@wizmail.org>2014-08-17 19:10:36 +0100
commitcafbabb774a4721e4ae7de7746ec0fc27d90d8b1 (patch)
tree1a7e6daa9cbbb2698d3e69de08c065863cc1ca5f
parent95fdc6efb795fe8f25bd76111b60e662a32a3531 (diff)
Safer coding for utf8clean expansion operator
-rw-r--r--src/src/expand.c12
-rw-r--r--test/confs/06003
2 files changed, 7 insertions, 8 deletions
diff --git a/src/src/expand.c b/src/src/expand.c
index 0b6513ccd..e3e1c7833 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -6370,18 +6370,16 @@ while (*s != 0)
case EOP_UTF8CLEAN:
{
- int seq_len, index = 0;
+ int seq_len = 0, index = 0;
int bytes_left = 0;
+ long codepoint = -1;
uschar seq_buff[4]; /* accumulate utf-8 here */
while (*sub != 0)
{
- int complete;
- long codepoint;
- uschar c;
+ int complete = 0;
+ uschar c = *sub++;
- complete = 0;
- c = *sub++;
if (bytes_left)
{
if ((c & 0xc0) != 0x80)
@@ -6396,7 +6394,7 @@ while (*s != 0)
if (--bytes_left == 0) /* codepoint complete */
{
if(codepoint > 0x10FFFF) /* is it too large? */
- complete = -1; /* error */
+ complete = -1; /* error (RFC3629 limit) */
else
{ /* finished; output utf-8 sequence */
yield = string_cat(yield, &size, &ptr, seq_buff, seq_len);
diff --git a/test/confs/0600 b/test/confs/0600
index 0347e4c60..61a9c0801 100644
--- a/test/confs/0600
+++ b/test/confs/0600
@@ -1,4 +1,5 @@
-# Exim test configuration 0005
+# Exim test configuration 0600
+# utf8clean:string
exim_path = EXIM_PATH
host_lookup_order = bydns