summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/src/expand.c15
-rw-r--r--test/scripts/0000-Basic/00021
-rw-r--r--test/stdout/00024
3 files changed, 14 insertions, 6 deletions
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
>