From 4d8c7b0d83d2370c3b1ef87b1a40044d056b4ee3 Mon Sep 17 00:00:00 2001
From: Martin Nilsson <nilsson@fastmail.com>
Date: Mon, 24 Jul 2017 04:29:54 +0200
Subject: [PATCH] Do not leak on regexp compilation error.

---
 src/modules/Regexp/pike_regexp.c | 5 ++++-
 src/modules/Regexp/testsuite.in  | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/modules/Regexp/pike_regexp.c b/src/modules/Regexp/pike_regexp.c
index e07097433d..b16fc22199 100644
--- a/src/modules/Regexp/pike_regexp.c
+++ b/src/modules/Regexp/pike_regexp.c
@@ -257,11 +257,13 @@ regexp *pike_regcomp(char *exp,int excompat)
     register ptrdiff_t len;
     int             flags;
     short	   *exp2,*dest,c;
+    ONERROR oerr;
 
     if (exp == (char *)NULL)
 	FAIL("NULL argument");
 
     exp2=xalloc( (strlen(exp)+1) * sizeof(short) );
+    SET_ONERROR(oerr, free, exp2);
     for ( scan=exp,dest=exp2;( c= UCHARAT(scan++)); ) {
 	switch (c) {
 	    case '(':
@@ -361,7 +363,8 @@ regexp *pike_regcomp(char *exp,int excompat)
 	    r->regmlen = len;
 	}
     }
-    free(exp2);
+
+    CALL_AND_UNSET_ONERROR(oerr);
     return (r);
 }
 
diff --git a/src/modules/Regexp/testsuite.in b/src/modules/Regexp/testsuite.in
index 28fc775606..714517b6c9 100644
--- a/src/modules/Regexp/testsuite.in
+++ b/src/modules/Regexp/testsuite.in
@@ -38,6 +38,7 @@ test_equal([[Regexp("c|a")->match(({ "a", "b", "c" }))]],({ "a", "c" }))
 
 dnl Regexp->split
 test_equal([[Regexp("^(a*)[^a]*$")->split("aaabbb")]],({"aaa"}))
+test_eval_error(Regexp("(a)"*40)->split("a"*50))
 
 dnl Regexp->replace
 test_equal([[ Regexp(".*")->replace("abrakadabra", "�") ]], "�")
-- 
GitLab