public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Fabian Groffen" <grobian@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: mail-mta/exim/, mail-mta/exim/files/
Date: Sun, 28 Jan 2024 18:20:03 +0000 (UTC)	[thread overview]
Message-ID: <1706466000.662e4585eef68252845c897c989764dddd350141.grobian@gentoo> (raw)

commit:     662e4585eef68252845c897c989764dddd350141
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Jan 28 18:18:46 2024 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Jan 28 18:20:00 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=662e4585

mail-mta/exim-4.97.1-r2: update upstream patches for pcre2 memory usage

Bug: https://bugs.gentoo.org/922780
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 ...exim-4.97.1-r1.ebuild => exim-4.97.1-r2.ebuild} |   0
 .../files/exim-4.97.1-memory-usage-bug-3047.patch  | 210 +++++++++++++++++++--
 2 files changed, 190 insertions(+), 20 deletions(-)

diff --git a/mail-mta/exim/exim-4.97.1-r1.ebuild b/mail-mta/exim/exim-4.97.1-r2.ebuild
similarity index 100%
rename from mail-mta/exim/exim-4.97.1-r1.ebuild
rename to mail-mta/exim/exim-4.97.1-r2.ebuild

diff --git a/mail-mta/exim/files/exim-4.97.1-memory-usage-bug-3047.patch b/mail-mta/exim/files/exim-4.97.1-memory-usage-bug-3047.patch
index f141d08bb7b4..75e5d1a42781 100644
--- a/mail-mta/exim/files/exim-4.97.1-memory-usage-bug-3047.patch
+++ b/mail-mta/exim/files/exim-4.97.1-memory-usage-bug-3047.patch
@@ -1,36 +1,60 @@
-https://bugs.exim.org/show_bug.cgi?id=3047
-https://bugs.gentoo.org/922780
+From b4e7527561f1c68b821d5cf25efe29ae63d1d434 Mon Sep 17 00:00:00 2001
+From: Jeremy Harris <jgh146exb@wizmail.org>
+Date: Thu, 25 Jan 2024 17:48:43 +0000
+Subject: [PATCH] Appendfile: release regex-match store every thousand files. 
+ Bug 3047
 
-diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c
-index ec41ca035..91b353079 100644
---- a/src/transports/appendfile.c
-+++ b/src/transports/appendfile.c
-@@ -153,6 +153,10 @@ static const char *mailbox_formats[] = {
-   (!ob->quota_warn_threshold_is_percent || ob->quota_value > 0))
+From 35aacb69f5c839a4b77158464e401d86eb422ed6 Mon Sep 17 00:00:00 2001
+From: Jeremy Harris <jgh146exb@wizmail.org>
+Date: Fri, 26 Jan 2024 21:58:59 +0000
+Subject: [PATCH] ACL: in "regex" condition, release store every thousand
+ lines.  Bug 3047
+
+
+diff --git a/src/src/exim.c b/src/src/exim.c
+--- a/src/exim.c
++++ b/src/exim.c
+@@ -49,6 +49,8 @@ optimize out the tail recursion and so not make them too expensive. */
+ static void *
+ function_store_malloc(PCRE2_SIZE size, void * tag)
+ {
++if (size > INT_MAX)
++  log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
+ return store_malloc((int)size);
+ }
  
+@@ -63,12 +65,15 @@ if (block) store_free(block);
+ static void *
+ function_store_get(PCRE2_SIZE size, void * tag)
+ {
++if (size > INT_MAX)
++  log_write(0, LOG_MAIN|LOG_PANIC_DIE, "excessive memory alloc request");
+ return store_get((int)size, GET_UNTAINTED);	/* loses track of taint */
+ }
+ 
+ static void
+ function_store_nullfree(void * block, void * tag)
+ {
++/* We cannot free memory allocated using store_get() */
+ }
  
-+/* Free memory allocated by PCRE2 every so often, because a recent version
-+is now using 20kB for every match call */
-+
-+#define RESET_STORE_FILECNT	1000
  
- /*************************************************
- *              Setup entry point                 *
+diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c
+--- a/src/transports/appendfile.c
++++ b/src/transports/appendfile.c
 @@ -661,13 +665,14 @@ Returns:        the sum of the sizes of the stattable files
  off_t
  check_dir_size(const uschar * dirname, int * countptr, const pcre2_code * re)
  {
--DIR *dir;
-+DIR * dir;
+ DIR *dir;
  off_t sum = 0;
 -int count = *countptr;
-+int count = *countptr, lcount = RESET_STORE_FILECNT;
++int count = *countptr, lcount = REGEX_LOOPCOUNT_STORE_RESET;
 +rmark reset_point = store_mark();
  
  if (!(dir = exim_opendir(dirname))) return 0;
  
--for (struct dirent *ent; ent = readdir(dir); )
-+for (struct dirent * ent; ent = readdir(dir); )
+ for (struct dirent *ent; ent = readdir(dir); )
    {
    uschar * path, * name = US ent->d_name;
    struct stat statbuf;
@@ -41,7 +65,7 @@ index ec41ca035..91b353079 100644
 +  if (--lcount == 0)
 +    {
 +    store_reset(reset_point); reset_point = store_mark();
-+    lcount = RESET_STORE_FILECNT;
++    lcount = REGEX_LOOPCOUNT_STORE_RESET;
 +    }
  
    /* If there's a regex, try to find the size using it */
@@ -54,3 +78,149 @@ index ec41ca035..91b353079 100644
  *countptr = count;
  return sum;
  }
+diff --git a/src/src/macros.h b/src/src/macros.h
+--- a/src/macros.h
++++ b/src/macros.h
+@@ -1185,4 +1185,9 @@ typedef enum {
+   sw_mrc_tx_fail,		/* transmit failed */
+ } sw_mrc_t;
+ 
++/* Recent versions of PCRE2 are allocating 20kB per match, rather than the previous 112 B.
++When doing en extended loop of matching, release store periodically. */
++
++#define	REGEX_LOOPCOUNT_STORE_RESET	1000
++
+ /* End of macros.h */
+diff --git a/src/src/regex.c b/src/src/regex.c
+--- a/src/regex.c
++++ b/src/regex.c
+@@ -31,12 +31,11 @@ extern uschar *mime_current_boundary;
+ 
+ 
+ static pcre_list *
+-compile(const uschar * list, BOOL cacheable)
++compile(const uschar * list, BOOL cacheable, int * cntp)
+ {
+-int sep = 0;
++int sep = 0, cnt = 0;
+ uschar * regex_string;
+-pcre_list * re_list_head = NULL;
+-pcre_list * ri;
++pcre_list * re_list_head = NULL, * ri;
+ 
+ /* precompile our regexes */
+ while ((regex_string = string_nextinlist(&list, &sep, NULL, 0)))
+@@ -58,7 +57,9 @@ while ((regex_string = string_nextinlist(&list, &sep, NULL, 0)))
+     ri->pcre_text = regex_string;
+     ri->next = re_list_head;
+     re_list_head = ri;
++    cnt++;
+     }
++if (cntp) *cntp = cnt;
+ return re_list_head;
+ }
+ 
+@@ -112,7 +113,8 @@ FILE * mbox_file;
+ pcre_list * re_list_head;
+ uschar * linebuffer;
+ long f_pos = 0;
+-int ret = FAIL;
++int ret = FAIL, cnt, lcount = REGEX_LOOPCOUNT_STORE_RESET;
++rmark reset_point;
+ 
+ regex_vars_clear();
+ 
+@@ -136,26 +138,34 @@ else
+   mbox_file = mime_stream;
+   }
+ 
+-/* precompile our regexes */
+-if (!(re_list_head = compile(*listptr, cacheable)))
+-  return FAIL;			/* no regexes -> nothing to do */
+-
+-/* match each line against all regexes */
+-linebuffer = store_get(32767, GET_TAINTED);
+-while (fgets(CS linebuffer, 32767, mbox_file))
++reset_point = store_mark();
+   {
+-  if (  mime_stream && mime_current_boundary		/* check boundary */
+-     && Ustrncmp(linebuffer, "--", 2) == 0
+-     && Ustrncmp((linebuffer+2), mime_current_boundary,
+-		  Ustrlen(mime_current_boundary)) == 0)
+-      break;						/* found boundary */
+-
+-  if ((ret = matcher(re_list_head, linebuffer, (int)Ustrlen(linebuffer))) == OK)
+-    goto done;
++  /* precompile our regexes */
++  if ((re_list_head = compile(*listptr, cacheable, &cnt)))
++    {
++    /* match each line against all regexes */
++    linebuffer = store_get(32767, GET_TAINTED);
++    while (fgets(CS linebuffer, 32767, mbox_file))
++      {
++      if (  mime_stream && mime_current_boundary		/* check boundary */
++	 && Ustrncmp(linebuffer, "--", 2) == 0
++	 && Ustrncmp((linebuffer+2), mime_current_boundary,
++		      Ustrlen(mime_current_boundary)) == 0)
++	break;						/* found boundary */
++
++      if ((ret = matcher(re_list_head, linebuffer, (int)Ustrlen(linebuffer))) == OK)
++	break;
++
++      if ((lcount -= cnt) <= 0)
++	{
++	store_reset(reset_point); reset_point = store_mark();
++	lcount = REGEX_LOOPCOUNT_STORE_RESET;
++	}
++      }
++    }
+   }
+-/* no matches ... */
++store_reset(reset_point);
+ 
+-done:
+ if (!mime_stream)
+   (void)fclose(mbox_file);
+ else
+@@ -180,14 +190,11 @@ pcre_list * re_list_head = NULL;
+ FILE * f;
+ uschar * mime_subject = NULL;
+ int mime_subject_len = 0;
+-int ret;
++int ret = FAIL;
++rmark reset_point;
+ 
+ regex_vars_clear();
+ 
+-/* precompile our regexes */
+-if (!(re_list_head = compile(*listptr, cacheable)))
+-  return FAIL;			/* no regexes -> nothing to do */
+-
+ /* check if the file is already decoded */
+ if (!mime_decoded_filename)
+   {				/* no, decode it first */
+@@ -210,12 +217,20 @@ if (!(f = fopen(CS mime_decoded_filename, "rb")))
+   return DEFER;
+   }
+ 
+-/* get 32k memory, tainted */
+-mime_subject = store_get(32767, GET_TAINTED);
++reset_point = store_mark();
++  {
++  /* precompile our regexes */
++  if ((re_list_head = compile(*listptr, cacheable, NULL)))
++    {
++    /* get 32k memory, tainted */
++    mime_subject = store_get(32767, GET_TAINTED);
+ 
+-mime_subject_len = fread(mime_subject, 1, 32766, f);
++    mime_subject_len = fread(mime_subject, 1, 32766, f);
+ 
+-ret = matcher(re_list_head, mime_subject, mime_subject_len);
++    ret = matcher(re_list_head, mime_subject, mime_subject_len);
++    }
++  }
++store_reset(reset_point);
+ (void)fclose(f);
+ return ret;
+ }


             reply	other threads:[~2024-01-28 18:20 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-28 18:20 Fabian Groffen [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-10-18 12:57 [gentoo-commits] repo/gentoo:master commit in: mail-mta/exim/, mail-mta/exim/files/ Fabian Groffen
2024-08-21  7:40 Fabian Groffen
2024-02-16 12:08 Fabian Groffen
2024-02-11 20:07 Fabian Groffen
2024-01-12 11:56 Fabian Groffen
2023-12-25 10:42 Fabian Groffen
2023-12-25 10:42 Fabian Groffen
2023-11-08  8:03 Fabian Groffen
2023-05-27  9:25 Fabian Groffen
2023-01-03 10:22 Fabian Groffen
2022-10-19  9:20 Fabian Groffen
2020-06-08  8:06 Fabian Groffen
2020-05-13  7:45 Fabian Groffen
2020-05-09  9:57 Fabian Groffen
2019-08-02  6:44 Fabian Groffen
2019-06-11  8:17 Fabian Groffen
2019-02-19 12:20 Fabian Groffen
2017-10-08  9:24 Fabian Groffen
2017-10-05 13:39 Fabian Groffen
2017-09-20  6:47 Fabian Groffen
2017-06-19 16:06 Thomas Deutschmann
2017-03-11  7:58 Fabian Groffen
2016-07-08 11:28 Fabian Groffen
2016-03-04 10:58 Fabian Groffen
2015-12-11  9:23 Fabian Groffen
2015-10-19 10:52 Sergey Popov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1706466000.662e4585eef68252845c897c989764dddd350141.grobian@gentoo \
    --to=grobian@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox