X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/7d5055276a22a91de71104775ade236051cebefc..1d28cc061677bd07d9bed48dd84bd5c590247043:/src/src/regex_cache.c diff --git a/src/src/regex_cache.c b/src/src/regex_cache.c index 6ac134cd8..a9b482174 100644 --- a/src/src/regex_cache.c +++ b/src/src/regex_cache.c @@ -5,6 +5,7 @@ /* * Copyright (c) The Exim Maintainers 2022 * License: GPL + * SPDX-License-Identifier: GPL-2.0-or-later */ /* Caching layers for compiled REs. There is a local layer in the process, @@ -39,6 +40,8 @@ typedef struct re_req { static tree_node * regex_cache = NULL; static tree_node * regex_caseless_cache = NULL; +#define REGEX_CACHESIZE_LIMIT 1000 + /******************************************************************************/ static void @@ -236,9 +239,14 @@ regex_at_daemon(const uschar * reqbuf) { const re_req * req = (const re_req *)reqbuf; uschar * errstr; -const pcre2_code * cre = regex_compile(req->re, - req->caseless ? MCS_CASELESS | MCS_CACHEABLE : MCS_CACHEABLE, - &errstr, pcre_gen_cmp_ctx); +const pcre2_code * cre; + +if (regex_cachesize >= REGEX_CACHESIZE_LIMIT) + errstr = US"regex cache size limit reached"; +else if ((cre = regex_compile(req->re, + req->caseless ? MCS_CASELESS | MCS_CACHEABLE : MCS_CACHEABLE, + &errstr, pcre_gen_cmp_ctx))) + regex_cachesize++; DEBUG(D_any) if (!cre) debug_printf("%s\n", errstr); return;