X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/059ec3d9952740285fb1ebf47961b8aca2eb1b4a..13b685f963e9313409f8350f718bac411829a5e7:/src/src/match.c diff --git a/src/src/match.c b/src/src/match.c index 9d2a1c0bd..100e4c0cb 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/match.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */ +/* $Cambridge: exim/src/src/match.c,v 1.8 2005/08/01 13:20:28 ph10 Exp $ */ /************************************************* * 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 */ @@ -266,12 +266,20 @@ up user@domain for sender rejection). There's a flag to disable it. */ 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++; -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; @@ -630,9 +638,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)); + + + p->data = (*valueptr == NULL)? NULL : string_copy(*valueptr); store_pool = old_pool; - p->data = *valueptr; p->next = nb->cache_data; nb->cache_data = p; if (*valueptr != NULL) @@ -695,8 +705,9 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) 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: @@ -780,13 +791,13 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL) 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: - fclose(f); + (void)fclose(f); goto DEFER_RETURN; case ERROR: /* host name lookup failed - this can only */ @@ -799,7 +810,7 @@ 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); - fclose(f); + (void)fclose(f); if (!include_unknown) return FAIL; log_write(0, LOG_MAIN, "%s: accepted by +include_unknown", error); return OK; @@ -811,7 +822,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; - fclose(f); + (void)fclose(f); } } /* Loop for the next item on the top-level list */ @@ -932,32 +943,24 @@ error = error; /* Keep clever compilers from complaining */ 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 == '^') return match_check_string(subject, pattern, cb->expand_setup, TRUE, cb->caseless, FALSE, NULL); -/* If the subject is the empty string, the only pattern it can match (other -than a regular expression) is the empty pattern. */ - -if (*subject == 0) return (*pattern == 0)? OK : FAIL; - -/* Find the domain in the subject */ - -sdomain = Ustrrchr(subject, '@'); - -/* Handle the case of a pattern that is just a lookup. Skip over possible -lookup names (letters, digits, hyphens). Skip over a possible * or *@ at -the end. Then we must have a semicolon for it to be a lookup. */ +/* Handle a pattern that is just a lookup. Skip over possible lookup names +(letters, digits, hyphens). Skip over a possible * or *@ at the end. Then we +must have a semicolon for it to be a lookup. */ for (s = pattern; isalnum(*s) || *s == '-'; s++); if (*s == '*') s++; if (*s == '@') s++; -/* If it is a straight lookup, do a lookup for the whole address. Partial -matching doesn't make sense here, so we ignore it, but write a panic log entry. -However, *@ matching will be honoured. */ +/* 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. */ if (*s == ';') { @@ -968,6 +971,16 @@ if (*s == ';') 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 +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. */