Fix ${if match_address crash when first argument had no @ (and was not
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 15 Nov 2005 11:19:38 +0000 (11:19 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 15 Nov 2005 11:19:38 +0000 (11:19 +0000)
empty).

doc/doc-txt/ChangeLog
src/src/match.c

index 13e8b4272f698d3f7caa623c35d3f0c17844db92..fdc52d7dd07894844036e3dbf4e8985c317a617b 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.262 2005/11/15 10:08:24 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.263 2005/11/15 11:19:38 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -130,6 +130,10 @@ PH/14 Add check_rfc2047_length to disable enforcement of RFC 2047 length
       checking when decoding. Apparently there are clients that generate
       overlong encoded strings. Why am I not surprised?
 
+PH/15 If the first argument of "${if match_address" was not empty, but did not
+      contain an "@" character, Exim crashed. Now it writes a panic log message
+      and treats the condition as false.
+
 
 Exim version 4.54
 -----------------
index ace8e016e4cfd0488e87f8ca483db7697bfd9bca..7cca71b7ff093c85897a922d6fda082a56a3dbd2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/match.c,v 1.10 2005/09/12 14:03:42 ph10 Exp $ */
+/* $Cambridge: exim/src/src/match.c,v 1.11 2005/11/15 11:19:38 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -955,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. */
 
@@ -989,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. */