diff --git a/src/modules/Regexp/pike_regexp.c b/src/modules/Regexp/pike_regexp.c
index e07097433d747340f3f0012d3c948460c32991f0..b16fc221999aaa70fd026b5e697d2eb2aeebed29 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 28fc7756067b49639ae3cd3d60ca17e83748c3ea..714517b6c96e19be5bc1930e4de2a4d2d2aa2b25 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", "�") ]], "�")