X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/a5a28604d8bf14b6521ed3ab028872b9cafd1b24..0a49a7a4f1090b6f1ce1d0f9d969804c9226b53e:/src/src/lookups/lsearch.c diff --git a/src/src/lookups/lsearch.c b/src/src/lookups/lsearch.c index f91ddf89c..ccb4850f2 100644 --- a/src/src/lookups/lsearch.c +++ b/src/src/lookups/lsearch.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/lookups/lsearch.c,v 1.3 2005/01/11 15:51:03 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); @@ -395,7 +408,7 @@ else void lsearch_close(void *handle) { -fclose((FILE *)handle); +(void)fclose((FILE *)handle); } /* End of lookups/lsearch.c */