X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fmatch.c;h=7cca71b7ff093c85897a922d6fda082a56a3dbd2;hb=096fee002700c404bfaa504ff0979c76b361782d;hp=100e4c0cbadd2f1bb2f03bc79e8d043389d2feb7;hpb=13b685f963e9313409f8350f718bac411829a5e7;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/match.c b/src/src/match.c index 100e4c0cb..7cca71b7f 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -1,4 +1,4 @@ -/* $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.11 2005/11/15 11:19:38 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -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. */