From: Jeremy Harris Date: Thu, 14 Apr 2016 12:31:20 +0000 (+0100) Subject: Expansions: fix forced-fail of extract. Bug 1815 X-Git-Tag: exim-4_88_RC1~120 X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=commitdiff_plain;h=1cf59ee7f68960237ad5cd3d599512fdbe5b3954 Expansions: fix forced-fail of extract. Bug 1815 --- diff --git a/src/src/expand.c b/src/src/expand.c index 5189cdcfe..241916100 100644 --- a/src/src/expand.c +++ b/src/src/expand.c @@ -5359,7 +5359,7 @@ while (*s != 0) case EITEM_EXTRACT: { int i; - int j = 2; + int j; int field_number = 1; BOOL field_number_set = FALSE; uschar *save_lookup_value = lookup_value; @@ -5369,12 +5369,12 @@ while (*s != 0) /* While skipping we cannot rely on the data for expansions being available (eg. $item) hence cannot decide on numeric vs. keyed. - Just read as many arguments as there are. */ + Read a maximum of 5 arguments (inclding the yes/no) */ if (skipping) { while (isspace(*s)) s++; - while (*s == '{') + for (j = 5; j > 0 && *s == '{'; j--) { if (!expand_string_internal(s+1, TRUE, &s, skipping, TRUE, &resetok)) goto EXPAND_FAILED; /*{*/ @@ -5385,6 +5385,13 @@ while (*s != 0) } while (isspace(*s)) s++; } + if ( Ustrncmp(s, "fail", 4) == 0 + && (s[4] == '}' || s[4] == ' ' || s[4] == '\t' || !s[4]) + ) + { + s += 4; + while (isspace(*s)) s++; + } if (*s != '}') { expand_string_message = US"missing '}' closing extract"; @@ -5392,7 +5399,7 @@ while (*s != 0) } } - else for (i = 0; i < j; i++) /* Read the proper number of arguments */ + else for (i = 0, j = 2; i < j; i++) /* Read the proper number of arguments */ { while (isspace(*s)) s++; if (*s == '{') /*}*/ diff --git a/test/scripts/0000-Basic/0002 b/test/scripts/0000-Basic/0002 index bc61998ca..583adcff0 100644 --- a/test/scripts/0000-Basic/0002 +++ b/test/scripts/0000-Basic/0002 @@ -617,6 +617,7 @@ ${extract{ 2 }{ }{a b c}} ${map{a,1:b,2:c,3}{${extract{1}{,}{$item}{$value}{}}}} ${map{a,1:b,2:c,3}{${extract{1}{,}{$item}{$value}{failcase}{bogus_argument}}}} +${map{a,1:b,2:c,3}{${extract{1}{,}{$item}{$value}fail}}} # Translation diff --git a/test/stdout/0002 b/test/stdout/0002 index 13ef57a45..9a2768bdc 100644 --- a/test/stdout/0002 +++ b/test/stdout/0002 @@ -579,8 +579,8 @@ > b > > a:b:c -> Failed: curly-bracket problem in conditional yes/no parsing: did not close with '}' - remaining string is '{bogus_argument}}}}' inside "map" item +> Failed: missing '}' closing extract inside "map" item +> a:b:c > > # Translation >