From: Philip Hazel Date: Tue, 15 Nov 2005 11:19:38 +0000 (+0000) Subject: Fix ${if match_address crash when first argument had no @ (and was not X-Git-Tag: exim-4_61~117 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/f091772774d0a744c3b8488575fc28205e6994b4 Fix ${if match_address crash when first argument had no @ (and was not empty). --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 13e8b4272..fdc52d7dd 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -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 ----------------- diff --git a/src/src/match.c b/src/src/match.c index ace8e016e..7cca71b7f 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -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. */