commit 9af2911: [Fix] Plug memory leak in regexp destruction with pcre2

Vsevolod Stakhov vsevolod at rspamd.com
Sun Sep 18 19:28:04 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-09-18 20:24:42 +0100
URL: https://github.com/rspamd/rspamd/commit/9af2911e8dfa989bcdbf1e3aa2eb999f3f6b7dad (HEAD -> master)

[Fix] Plug memory leak in regexp destruction with pcre2

---
 src/libutil/regexp.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/libutil/regexp.c b/src/libutil/regexp.c
index 534187f37..70a50872a 100644
--- a/src/libutil/regexp.c
+++ b/src/libutil/regexp.c
@@ -116,28 +116,33 @@ rspamd_regexp_dtor (rspamd_regexp_t *re)
 	if (re) {
 		if (re->raw_re && re->raw_re != re->re) {
 #ifndef WITH_PCRE2
-#ifdef HAVE_PCRE_JIT
+			/* PCRE1 version */
+# ifdef HAVE_PCRE_JIT
 			if (re->raw_extra) {
 				pcre_free_study (re->raw_extra);
 			}
-#endif
+# endif
 #else
-			if (re->mcontext) {
-				pcre2_match_context_free (re->mcontext);
+			/* PCRE 2 version */
+			if (re->raw_mcontext) {
+				pcre2_match_context_free (re->raw_mcontext);
 			}
 #endif
 			PCRE_FREE (re->raw_re);
 		}
+
 		if (re->re) {
 #ifndef WITH_PCRE2
-#ifdef HAVE_PCRE_JIT
+			/* PCRE1 version */
+# ifdef HAVE_PCRE_JIT
 			if (re->extra) {
 				pcre_free_study (re->extra);
 			}
-#endif
+# endif
 #else
-			if (re->raw_mcontext) {
-				pcre2_match_context_free (re->raw_mcontext);
+			/* PCRE 2 version */
+			if (re->mcontext) {
+				pcre2_match_context_free (re->mcontext);
 			}
 #endif
 			PCRE_FREE (re->re);
@@ -169,15 +174,18 @@ rspamd_regexp_post_process (rspamd_regexp_t *r)
 	pcre2_set_recursion_limit (r->mcontext, max_recursion_depth);
 	pcre2_set_match_limit (r->mcontext, max_backtrack);
 
-	if (r->re != r->raw_re) {
+	if (r->raw_re && r->re != r->raw_re) {
 		r->raw_mcontext = pcre2_match_context_create (NULL);
 		g_assert (r->raw_mcontext != NULL);
 		pcre2_set_recursion_limit (r->raw_mcontext, max_recursion_depth);
 		pcre2_set_match_limit (r->raw_mcontext, max_backtrack);
 	}
-	else {
+	else if (r->raw_re) {
 		r->raw_mcontext = r->mcontext;
 	}
+	else {
+		r->raw_mcontext = NULL;
+	}
 
 #ifdef HAVE_PCRE_JIT
 	if (can_jit) {


More information about the Commits mailing list