Fix ${extract } corrupting an enclosing ${reduce } $value. Bug 2061
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 26 Feb 2017 01:07:47 +0000 (01:07 +0000)
committerPhil Pennock <pdp@exim.org>
Sun, 26 Feb 2017 18:32:09 +0000 (13:32 -0500)
Broken-by: 20fcb1e7be45 - Bug 1870
(cherry picked from commit 9e09521e621d852ac4828f1865b4ccb01568d9ee)
Signed-off-by: Phil Pennock <pdp@exim.org>
src/src/expand.c

index 55fb0b875cb4136ee418282aa3742369da412163..2027eb84c6555a07bb08ad8b6c7782152cb44315 100644 (file)
@@ -3194,17 +3194,17 @@ items. */
 while (isspace(*s)) s++;
 if (*s == '}')
   {
 while (isspace(*s)) s++;
 if (*s == '}')
   {
-  if (!skipping)
-    if (type[0] == 'i')
-      {
-      if (yes) *yieldptr = string_catn(*yieldptr, sizeptr, ptrptr, US"true", 4);
-      }
-    else
-      {
-      if (yes && lookup_value)
-       *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value);
-      lookup_value = save_lookup;
-      }
+  if (type[0] == 'i')
+    {
+    if (yes && !skipping)
+      *yieldptr = string_catn(*yieldptr, sizeptr, ptrptr, US"true", 4);
+    }
+  else
+    {
+    if (yes && lookup_value && !skipping)
+      *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value);
+    lookup_value = save_lookup;
+    }
   s++;
   goto RETURN;
   }
   s++;
   goto RETURN;
   }
@@ -5801,11 +5801,12 @@ while (*s != 0)
       processing for real, we perform the iteration. */
 
       if (skipping) continue;
       processing for real, we perform the iteration. */
 
       if (skipping) continue;
-      while ((iterate_item = string_nextinlist(&list, &sep, NULL, 0)) != NULL)
+      while ((iterate_item = string_nextinlist(&list, &sep, NULL, 0)))
         {
         *outsep = (uschar)sep;      /* Separator as a string */
 
         {
         *outsep = (uschar)sep;      /* Separator as a string */
 
-        DEBUG(D_expand) debug_printf_indent("%s: $item = \"%s\"\n", name, iterate_item);
+       DEBUG(D_expand) debug_printf_indent("%s: $item = '%s'  $value = '%s'\n",
+                         name, iterate_item, lookup_value);
 
         if (item_type == EITEM_FILTER)
           {
 
         if (item_type == EITEM_FILTER)
           {