Update copyright year in (most) files (those that my script finds).
[exim.git] / src / src / match.c
index 100e4c0cbadd2f1bb2f03bc79e8d043389d2feb7..36094f4a3ca15a19bbea986d30aeaa96777f2375 100644 (file)
@@ -1,10 +1,10 @@
-/* $Cambridge: exim/src/src/match.c,v 1.8 2005/08/01 13:20:28 ph10 Exp $ */
+/* $Cambridge: exim/src/src/match.c,v 1.12 2006/02/07 11:19:00 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2006 */
 /* 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)
-      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;
     }
 
@@ -720,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);
-          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;
           }
@@ -811,7 +818,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);
           (void)fclose(f);
-          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;
           }
@@ -943,6 +955,20 @@ error = error;  /* Keep clever compilers from complaining */
 DEBUG(D_lists) debug_printf("address match: subject=%s pattern=%s\n",
   subject, pattern);
 
+/* Find the subject's domain */
+
+sdomain = Ustrrchr(subject, '@');
+
+/* The only case where a subject may not have a domain is if the subject is
+empty. Otherwise, a subject with no domain is a serious configuration error. */
+
+if (sdomain == NULL && *subject != 0)
+  {
+  log_write(0, LOG_MAIN|LOG_PANIC, "no @ found in the subject of an "
+    "address list match: subject=\"%s\" pattern=\"%s\"", subject, pattern);
+  return FAIL;
+  }
+
 /* Handle a regular expression, which must match the entire incoming address.
 This may be the empty address. */
 
@@ -977,10 +1003,6 @@ against. */
 
 if (*subject == 0) return (*pattern == 0)? OK : FAIL;
 
-/* Find the subject's domain */
-
-sdomain = Ustrrchr(subject, '@');
-
 /* If the pattern starts with "@@" we have a split lookup, where the domain is
 looked up to obtain a list of local parts. If the subject's local part is just
 "*" (called from retry) the match always fails. */