Apply the fix for widen_domains to qualify_single and search_parents
[exim.git] / src / src / match.c
index eb54f232a3ca48f14c1e6ccfb4d9ef55c67610ba..ace8e016e4cfd0488e87f8ca483db7697bfd9bca 100644 (file)
@@ -1,10 +1,10 @@
-/* $Cambridge: exim/src/src/match.c,v 1.2 2004/11/12 15:03:40 ph10 Exp $ */
+/* $Cambridge: exim/src/src/match.c,v 1.10 2005/09/12 14:03:42 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2005 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions for matching strings */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions for matching strings */
@@ -174,7 +174,9 @@ if (cb->at_is_special && pattern[0] == '@')
     int slen = Ustrlen(s);
     if (s[0] != '[' && s[slen-1] != ']') return FAIL;
     for (ip = host_find_interfaces(); ip != NULL; ip = ip->next)
     int slen = Ustrlen(s);
     if (s[0] != '[' && s[slen-1] != ']') return FAIL;
     for (ip = host_find_interfaces(); ip != NULL; ip = ip->next)
-      if (Ustrncmp(ip->address, s+1, slen - 2) == 0) return OK;
+      if (Ustrncmp(ip->address, s+1, slen - 2) == 0
+            && ip->address[slen - 2] == 0)
+        return OK;
     return FAIL;
     }
 
     return FAIL;
     }
 
@@ -266,12 +268,20 @@ up user@domain for sender rejection). There's a flag to disable it. */
 
 if (!cb->use_partial) partial = -1;
 
 
 if (!cb->use_partial) partial = -1;
 
-/* Set the parameters for the two different kinds of lookup. */
+/* Set the parameters for the three different kinds of lookup. */
 
 keyquery = semicolon + 1;
 while (isspace(*keyquery)) keyquery++;
 
 
 keyquery = semicolon + 1;
 while (isspace(*keyquery)) keyquery++;
 
-if (!mac_islookup(search_type, lookup_querystyle))
+if (mac_islookup(search_type, lookup_absfilequery))
+  {
+  filename = keyquery;
+  while (*keyquery != 0 && !isspace(*keyquery)) keyquery++;
+  filename = string_copyn(filename, keyquery - filename);
+  while (isspace(*keyquery)) keyquery++;
+  }
+
+else if (!mac_islookup(search_type, lookup_querystyle))
   {
   filename = keyquery;
   keyquery = s;
   {
   filename = keyquery;
   keyquery = s;
@@ -630,9 +640,11 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
             store_pool = POOL_PERM;
             p = store_get(sizeof(namedlist_cacheblock));
             p->key = string_copy(get_check_key(arg, type));
             store_pool = POOL_PERM;
             p = store_get(sizeof(namedlist_cacheblock));
             p->key = string_copy(get_check_key(arg, type));
+
+
+            p->data = (*valueptr == NULL)? NULL : string_copy(*valueptr);
             store_pool = old_pool;
 
             store_pool = old_pool;
 
-            p->data = *valueptr;
             p->next = nb->cache_data;
             nb->cache_data = p;
             if (*valueptr != NULL)
             p->next = nb->cache_data;
             nb->cache_data = p;
             if (*valueptr != NULL)
@@ -695,8 +707,9 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
         case DEFER:
         goto DEFER_RETURN;
 
         case DEFER:
         goto DEFER_RETURN;
 
-        /* The ERROR return occurs only when checking hosts, when either a
-        forward or reverse lookup has failed. The error string gives details of
+        /* The ERROR return occurs when checking hosts, when either a forward
+        or reverse lookup has failed. It can also occur in a match_ip list if a
+        non-IP address item is encountered. The error string gives details of
         which it was. */
 
         case ERROR:
         which it was. */
 
         case ERROR:
@@ -709,7 +722,12 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
           {
           HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot,
             include_unknown? "yes":"no", error);
           {
           HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot,
             include_unknown? "yes":"no", error);
-          if (!include_unknown) return FAIL;
+          if (!include_unknown)
+            {
+            if ((log_extra_selector & LX_unknown_in_list) != 0)
+              log_write(0, LOG_MAIN, "list matching forced to fail: %s", error);
+            return FAIL;
+            }
           log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error);
           return OK;
           }
           log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error);
           return OK;
           }
@@ -780,13 +798,13 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
       switch ((func)(arg, ss, valueptr, &error))
         {
         case OK:
       switch ((func)(arg, ss, valueptr, &error))
         {
         case OK:
-        fclose(f);
+        (void)fclose(f);
         HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot,
           (yield == OK)? "yes" : "no", sss, filename);
         return file_yield;
 
         case DEFER:
         HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot,
           (yield == OK)? "yes" : "no", sss, filename);
         return file_yield;
 
         case DEFER:
-        fclose(f);
+        (void)fclose(f);
         goto DEFER_RETURN;
 
         case ERROR:          /* host name lookup failed - this can only */
         goto DEFER_RETURN;
 
         case ERROR:          /* host name lookup failed - this can only */
@@ -799,8 +817,13 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
          {
           HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot,
             include_unknown? "yes":"no", error);
          {
           HDEBUG(D_lists) debug_printf("%s %s (%s)\n", ot,
             include_unknown? "yes":"no", error);
-          fclose(f);
-          if (!include_unknown) return FAIL;
+          (void)fclose(f);
+          if (!include_unknown)
+            {
+            if ((log_extra_selector & LX_unknown_in_list) != 0)
+              log_write(0, LOG_MAIN, "list matching forced to fail: %s", error);
+            return FAIL;
+            }
           log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error);
           return OK;
           }
           log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error);
           return OK;
           }
@@ -811,7 +834,7 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
     for the file, in case this is the last item in the list. */
 
     yield = file_yield;
     for the file, in case this is the last item in the list. */
 
     yield = file_yield;
-    fclose(f);
+    (void)fclose(f);
     }
   }    /* Loop for the next item on the top-level list */
 
     }
   }    /* Loop for the next item on the top-level list */
 
@@ -932,7 +955,7 @@ error = error;  /* Keep clever compilers from complaining */
 DEBUG(D_lists) debug_printf("address match: subject=%s pattern=%s\n",
   subject, pattern);
 
 DEBUG(D_lists) debug_printf("address match: subject=%s pattern=%s\n",
   subject, pattern);
 
-/* Handle a regular expression, which must match the entire incoming address. 
+/* Handle a regular expression, which must match the entire incoming address.
 This may be the empty address. */
 
 if (*pattern == '^')
 This may be the empty address. */
 
 if (*pattern == '^')
@@ -947,7 +970,7 @@ for (s = pattern; isalnum(*s) || *s == '-'; s++);
 if (*s == '*') s++;
 if (*s == '@') s++;
 
 if (*s == '*') s++;
 if (*s == '@') s++;
 
-/* If it is a straight lookup, do a lookup for the whole address. This may be 
+/* If it is a straight lookup, do a lookup for the whole address. This may be
 the empty address. Partial matching doesn't make sense here, so we ignore it,
 but write a panic log entry. However, *@ matching will be honoured. */
 
 the empty address. Partial matching doesn't make sense here, so we ignore it,
 but write a panic log entry. However, *@ matching will be honoured. */
 
@@ -960,8 +983,8 @@ if (*s == ';')
     valueptr);
   }
 
     valueptr);
   }
 
-/* For the remaining cases, an empty subject matches only an empty pattern, 
-because other patterns expect to have a local part and a domain to match 
+/* For the remaining cases, an empty subject matches only an empty pattern,
+because other patterns expect to have a local part and a domain to match
 against. */
 
 if (*subject == 0) return (*pattern == 0)? OK : FAIL;
 against. */
 
 if (*subject == 0) return (*pattern == 0)? OK : FAIL;