Broken by my compile quitening; the issue was a variable
declared local in a loop body and used for carrying data
from one iteration to the next. I'd blindly added an
initialiser, destroying the data. However, I *think* that
compilers might be at liberty to not use the same location
for separate iterations; if so the code was broken (and only
worked by chance). Fix by moving the declaration outside
the loop.
{
int seq_len = 0, index = 0;
int bytes_left = 0;
{
int seq_len = 0, index = 0;
int bytes_left = 0;
uschar seq_buff[4]; /* accumulate utf-8 here */
while (*sub != 0)
{
uschar seq_buff[4]; /* accumulate utf-8 here */
while (*sub != 0)
{
- int complete;
- long codepoint = 0;
- uschar c;
+ int complete = 0;
+ uschar c = *sub++;
- complete = 0;
- c = *sub++;
if (bytes_left)
{
if ((c & 0xc0) != 0x80)
if (bytes_left)
{
if ((c & 0xc0) != 0x80)
if (--bytes_left == 0) /* codepoint complete */
{
if(codepoint > 0x10FFFF) /* is it too large? */
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);
else
{ /* finished; output utf-8 sequence */
yield = string_cat(yield, &size, &ptr, seq_buff, seq_len);
-# Exim test configuration 0005
+# Exim test configuration 0600
+# utf8clean:string
exim_path = EXIM_PATH
host_lookup_order = bydns
exim_path = EXIM_PATH
host_lookup_order = bydns