X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fmatch.c;h=e07d0bd59fa5ace12f58e721195dee5b48f55dc2;hb=6f585046cf0b00509f0ff7c8f8a48b9cf7c2ab75;hp=43f5912fd4cc8a50ba3c26bb55dfe04b367cee45;hpb=d7978c0f8af20ff4c3f770589b1bb81568aecff3;p=exim.git diff --git a/src/src/match.c b/src/src/match.c index 43f5912fd..e07d0bd59 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -3,6 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for matching strings */ @@ -97,7 +98,7 @@ check_string(void *arg, const uschar *pattern, const uschar **valueptr, uschar * const check_string_block *cb = arg; int search_type, partial, affixlen, starflags; int expand_setup = cb->expand_setup; -const uschar *affix; +const uschar * affix, * opts; uschar *s; uschar *filename = NULL; uschar *keyquery, *result, *semicolon; @@ -263,7 +264,7 @@ the part of the string preceding the semicolon. */ *semicolon = 0; search_type = search_findtype_partial(pattern, &partial, &affix, &affixlen, - &starflags); + &starflags, &opts); *semicolon = ';'; if (search_type < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", search_error_message); @@ -276,14 +277,14 @@ if (!cb->use_partial) partial = -1; /* Set the parameters for the three different kinds of lookup. */ keyquery = semicolon + 1; -while (isspace(*keyquery)) keyquery++; +Uskip_whitespace(&keyquery); if (mac_islookup(search_type, lookup_absfilequery)) { filename = keyquery; - while (*keyquery != 0 && !isspace(*keyquery)) keyquery++; + while (*keyquery && !isspace(*keyquery)) keyquery++; filename = string_copyn(filename, keyquery - filename); - while (isspace(*keyquery)) keyquery++; + Uskip_whitespace(&keyquery); } else if (!mac_islookup(search_type, lookup_querystyle)) @@ -299,9 +300,9 @@ no search_close() because of the caching arrangements. */ if (!(handle = search_open(filename, search_type, 0, NULL, NULL))) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", search_error_message); result = search_find(handle, filename, keyquery, partial, affix, affixlen, - starflags, &expand_setup); + starflags, &expand_setup, opts); -if (!result) return f.search_find_defer? DEFER : FAIL; +if (!result) return f.search_find_defer ? DEFER : FAIL; if (valueptr) *valueptr = result; expand_nmax = expand_setup; @@ -446,7 +447,6 @@ BOOL ignore_defer = FALSE; const uschar *list; uschar *sss; uschar *ot = NULL; -uschar buffer[1024]; /* Save time by not scanning for the option name when we don't need it. */ @@ -506,12 +506,12 @@ else /* For an unnamed list, use the expanded version in comments */ -HDEBUG(D_any) if (ot == NULL) ot = string_sprintf("%s in \"%s\"?", name, list); +HDEBUG(D_any) if (!ot) ot = string_sprintf("%s in \"%s\"?", name, list); /* Now scan the list and process each item in turn, until one of them matches, or we hit an error. */ -while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer)))) +while ((sss = string_nextinlist(&list, &sep, NULL, 0))) { uschar * ss = sss; @@ -541,7 +541,7 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer)))) if (Ustrcmp(ss, "+caseful") == 0) { check_string_block *cb = (check_string_block *)arg; - Ustrcpy(cb->subject, cb->origsubject); + Ustrcpy(US cb->subject, cb->origsubject); cb->caseless = FALSE; continue; } @@ -666,7 +666,7 @@ while ((sss = string_nextinlist(&list, &sep, buffer, sizeof(buffer)))) so we use the permanent store pool */ store_pool = POOL_PERM; - p = store_get(sizeof(namedlist_cacheblock)); + p = store_get(sizeof(namedlist_cacheblock), FALSE); p->key = string_copy(get_check_key(arg, type)); @@ -1277,6 +1277,7 @@ match_address_list(const uschar *address, BOOL caseless, BOOL expand, { check_address_block ab; unsigned int *local_cache_bits = cache_bits; +int len; /* RFC 2505 recommends that for spam checking, local parts should be caselessly compared. Therefore, Exim now forces the entire address into lower case here, @@ -1285,8 +1286,10 @@ patterns.) Otherwise just the domain is lower cases. A magic item "+caseful" in the list can be used to restore a caseful copy of the local part from the original address. */ -sprintf(CS big_buffer, "%.*s", big_buffer_size - 1, address); -for (uschar * p = big_buffer + Ustrlen(big_buffer) - 1; p >= big_buffer; p--) +if ((len = Ustrlen(address)) > 255) len = 255; +ab.address = string_copyn(address, len); + +for (uschar * p = ab.address + len - 1; p >= ab.address; p--) { if (!caseless && *p == '@') break; *p = tolower(*p); @@ -1307,7 +1310,7 @@ if (expand_setup == 0) /* Set up the data to be passed ultimately to check_address. */ ab.origaddress = address; -ab.address = big_buffer; +/* ab.address is above */ ab.expand_setup = expand_setup; ab.caseless = caseless;