X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/0cd95fa34e04827767674b6a5545c55ae391a3e2..bc3e80bcacbe4be437fe43a8babe2e4896837d95:/src/src/match.c diff --git a/src/src/match.c b/src/src/match.c index 42145e98e..6415b993d 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -3,7 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2018 */ -/* Copyright (c) The Exim Maintainers 2020 */ +/* Copyright (c) The Exim Maintainers 2020 - 2021 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions for matching strings */ @@ -128,9 +128,9 @@ required. */ if (pattern[0] == '^') { - const pcre * re = regex_must_compile(pattern, cb->caseless, FALSE); + const pcre2_code * re = regex_must_compile(pattern, cb->caseless, FALSE); if (expand_setup < 0 - ? pcre_exec(re, NULL, CCS s, Ustrlen(s), 0, PCRE_EOPT, NULL, 0) < 0 + ? !regex_match(re, s, -1, NULL) : !regex_match_and_setup(re, s, 0, expand_setup) ) return FAIL; @@ -498,8 +498,18 @@ else } /* For an unnamed list, use the expanded version in comments */ +#define LIST_LIMIT_PR 2048 -HDEBUG(D_any) if (!ot) ot = string_sprintf("%s in \"%s\"?", name, list); +HDEBUG(D_any) if (!ot) + { + int n, m; + gstring * g = string_fmt_append(NULL, "%s in \"%n%.*s%n\"", + name, &n, LIST_LIMIT_PR, list, &m); + if (m - n >= LIST_LIMIT_PR) g = string_catn(g, US"...", 3); + g = string_catn(g, US"?", 1); + gstring_release_unused(g); + ot = string_from_gstring(g); + } /* Now scan the list and process each item in turn, until one of them matches, or we hit an error. */ @@ -705,7 +715,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) if ((bits & (-bits)) == bits) /* Only one of the two bits is set */ { HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\"%s)\n", ot, - (yield == OK)? "yes" : "no", sss, cached); + yield == OK ? "yes" : "no", sss, cached); return yield; } } @@ -1274,7 +1284,7 @@ provided that "caseless" is set. (It is FALSE for calls for matching rewriting 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. -Limit the subject address size to avoid mem-exhastion attacks. The size chosen +Limit the subject address size to avoid mem-exhaustion attacks. The size chosen is historical (we used to use big_buffer here). */ if ((len = Ustrlen(address)) > BIG_BUFFER_SIZE) len = BIG_BUFFER_SIZE;