Regex cache observability
authorJeremy Harris <jgh146exb@wizmail.org>
Mon, 20 Jun 2022 11:38:20 +0000 (12:38 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Mon, 20 Jun 2022 11:38:20 +0000 (12:38 +0100)
src/src/expand.c
src/src/globals.c
src/src/globals.h
src/src/regex_cache.c

index 5147c51e7827c5d6ac77886bf3b70bb088452b73..acde8d5164ba731c9a082b6a49770b0a88d06845 100644 (file)
@@ -692,6 +692,7 @@ static var_entry var_table[] = {
   { "recipient_verify_failure",vtype_stringptr,&recipient_verify_failure },
   { "recipients",          vtype_string_func, (void *) &fn_recipients },
   { "recipients_count",    vtype_int,         &recipients_count },
+  { "regex_cachesize",     vtype_int,         &regex_cachesize },/* undocumented; devel observability */
 #ifdef WITH_CONTENT_SCAN
   { "regex_match_string",  vtype_stringptr,   &regex_match_string },
 #endif
index 49988a8cc9c0e4eaf04ad50627e6ffe594e9bdc6..c95d24b4743aadf90a3aa01497ce9870497ced5a 100644 (file)
@@ -1317,6 +1317,7 @@ const pcre2_code *regex_SIZE         = NULL;
 #ifndef DISABLE_PIPE_CONNECT
 const pcre2_code *regex_EARLY_PIPE   = NULL;
 #endif
+int    regex_cachesize              = 0;
 const pcre2_code *regex_ismsgid      = NULL;
 const pcre2_code *regex_smtp_code    = NULL;
 const uschar *regex_vars[REGEX_VARS];
index 3d558455582b1d39b5b908093e0593e27308a374..c9ef5e484ff045b5ebbaece100fa0c697d3a53de 100644 (file)
@@ -899,6 +899,7 @@ extern const pcre2_code  *regex_SIZE;        /* For recognizing SIZE settings */
 #ifndef DISABLE_PIPE_CONNECT
 extern const pcre2_code  *regex_EARLY_PIPE;  /* For recognizing PIPE_CONNCT */
 #endif
+extern int    regex_cachesize;              /* number of entries */
 extern const pcre2_code  *regex_ismsgid;     /* Compiled r.e. for message ID */
 extern const pcre2_code  *regex_smtp_code;   /* For recognizing SMTP codes */
 extern const uschar *regex_vars[];           /* $regexN variables */
index 6ac134cd8d8debe8c74fce299d0084b8e417759c..63cddce1db91449c32cfe449286527dc4434d2ce 100644 (file)
@@ -39,6 +39,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 +238,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;