Fix small typo
[exim.git] / src / src / match.c
index 597b633fee8d932df4165aeaee7ccc14f06b9db2..f8edd5df5f5884cf10cf50b909ccac538d7832f8 100644 (file)
@@ -498,8 +498,18 @@ else
   }
 
 /* For an unnamed list, use the expanded version in comments */
+#define LIST_LIMIT_PR 2048
 
-HDEBUG(D_any) if (!ot) ot = string_sprintf("%s in \"%s\"?", name, list);
+HDEBUG(D_any) if (!ot)
+  {
+  int n, m;
+  gstring * g = string_fmt_append(NULL, "%s in \"%n%.*s%n\"",
+    name, &n, LIST_LIMIT_PR, list, &m);
+  if (m - n >= LIST_LIMIT_PR) g = string_catn(g, US"...", 3);
+  g = string_catn(g, US"?", 1);
+  gstring_release_unused(g);
+  ot = string_from_gstring(g);
+  }
 
 /* Now scan the list and process each item in turn, until one of them matches,
 or we hit an error. */
@@ -705,7 +715,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
       if ((bits & (-bits)) == bits)    /* Only one of the two bits is set */
         {
         HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\"%s)\n", ot,
-          (yield == OK)? "yes" : "no", sss, cached);
+          yield == OK ? "yes" : "no", sss, cached);
         return yield;
         }
       }
@@ -809,19 +819,19 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
         sss = ss + 1;
         }
 
-      ss = filebuffer + Ustrlen(filebuffer);             /* trailing space */
+      ss = filebuffer + Ustrlen(filebuffer);           /* trailing space */
       while (ss > filebuffer && isspace(ss[-1])) ss--;
       *ss = 0;
 
       ss = filebuffer;
-      while (isspace(*ss)) ss++;                         /* leading space */
+      while (isspace(*ss)) ss++;                       /* leading space */
 
-      if (*ss == 0) continue;                            /* ignore empty */
+      if (!*ss) continue;                              /* ignore empty */
 
-      file_yield = yield;                                /* positive yield */
-      sss = ss;                                          /* for debugging */
+      file_yield = yield;                              /* positive yield */
+      sss = ss;                                                /* for debugging */
 
-      if (*ss == '!')                                    /* negation */
+      if (*ss == '!')                                  /* negation */
         {
         file_yield = (file_yield == OK)? FAIL : OK;
         while (isspace((*(++ss))));
@@ -833,6 +843,11 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
          (void)fclose(f);
          HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot,
            yield == OK ? "yes" : "no", sss, filename);
+
+         /* The "pattern" being matched came from the file; we use a stack-local.
+         Copy it to allocated memory now we know it matched. */
+
+         if (valueptr) *valueptr = string_copy(ss);
          return file_yield;
 
         case DEFER:
@@ -1269,8 +1284,8 @@ provided that "caseless" is set. (It is FALSE for calls for matching rewriting
 patterns.) Otherwise just the domain is lower cases. A magic item "+caseful" in
 the list can be used to restore a caseful copy of the local part from the
 original address.
-Limit the subject address size to avoid mem-exhastion attacks.  The size chosen
-is historical (we used to use big_buffer her). */
+Limit the subject address size to avoid mem-exhaustion attacks.  The size chosen
+is historical (we used to use big_buffer here). */
 
 if ((len = Ustrlen(address)) > BIG_BUFFER_SIZE) len = BIG_BUFFER_SIZE;
 ab.address = string_copyn(address, len);