Update all copyright messages to cover 1995 - 2009. Remove tab from exim_checkaccess.src
[exim.git] / src / src / lookups / lsearch.c
index c5e75dfddc97611c0430306095dbc3ac5e355513..ccb4850f285572b76c697b28478e74a912c241c7 100644 (file)
@@ -1,10 +1,10 @@
-/* $Cambridge: exim/src/src/lookups/lsearch.c,v 1.4 2005/06/27 14:29:44 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/lsearch.c,v 1.11 2009/11/16 19:50:38 nm4 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2009 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 #include "../exim.h"
@@ -107,6 +107,7 @@ for (last_was_eol = TRUE;
   int ptr, size;
   int p = Ustrlen(buffer);
   int linekeylength;
+  BOOL this_is_comment;
   uschar *yield;
   uschar *s = buffer;
 
@@ -197,7 +198,16 @@ for (last_was_eol = TRUE;
       if (rc == FAIL) continue;
       if (rc == DEFER) return DEFER;
       }
-    break;      /* Key matched */
+
+    /* The key has matched. If the search involved a regular expression, it
+    might have caused numerical variables to be set. However, their values will
+    be in the wrong storage pool for external use. Copying them to the standard
+    pool is not feasible because of the caching of lookup results - a repeated
+    lookup will not match the regular expression again. Therefore, we flatten
+    all numeric variables at this point. */
+
+    expand_nmax = -1;
+    break;
 
     /* Compare an ip address against a list of network/ip addresses. We have to
     allow for the "*" case specially. */
@@ -246,6 +256,7 @@ for (last_was_eol = TRUE;
 
   Initialize, and copy the first segment of data. */
 
+  this_is_comment = FALSE;
   size = 100;
   ptr = 0;
   yield = store_get(size);
@@ -276,11 +287,13 @@ for (last_was_eol = TRUE;
 
     if (last_was_eol)
       {
-      if (buffer[0] == 0 || buffer[0] == '#') continue;
+      this_is_comment = (this_is_comment || (buffer[0] == 0 || buffer[0] == '#'));
+      if (this_is_comment) continue;
       if (!isspace((uschar)buffer[0])) break;
       while (isspace((uschar)*s)) s++;
       *(--s) = ' ';
       }
+    if (this_is_comment) continue;
 
     /* Join a physical or logical line continuation onto the result string. */
 
@@ -369,7 +382,7 @@ iplsearch_find(void *handle, uschar *filename, uschar *keystring, int length,
 {
 do_cache = do_cache;  /* Keep picky compilers happy */
 if ((length == 1 && keystring[0] == '*') ||
-    string_is_ip_address(keystring, NULL) > 0)
+    string_is_ip_address(keystring, NULL) != 0)
   {
   return internal_lsearch_find(handle, filename, keystring, length, result,
     errmsg, LSEARCH_IP);