From 6bffacefaf8c6f37f46fb1ff388d3bb20e58c9b4 Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com>
Date: Sun, 2 Aug 2015 21:46:57 +0200
Subject: [PATCH] fix memory leak introduced by putting setjmp in the wrong
 place

---
 src/backends/regex.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/backends/regex.c b/src/backends/regex.c
index cba50e65..5fe3aa0b 100644
--- a/src/backends/regex.c
+++ b/src/backends/regex.c
@@ -348,12 +348,7 @@ bool h_svm_action_clear_to_mark(HArena *arena, HSVMContext *ctx, void* env) {
 // Glue regex backend to rest of system
 
 bool h_compile_regex(HRVMProg *prog, const HParser *parser) {
-  if (setjmp(prog->except)) {
-    return false;
-  }
-  bool ret = parser->vtable->compile_to_rvm(prog, parser->env);
-  memset(prog->except, 0, sizeof(prog->except));
-  return ret;
+  return parser->vtable->compile_to_rvm(prog, parser->env);
 }
 
 static void h_regex_free(HParser *parser) {
@@ -375,12 +370,16 @@ static int h_regex_compile(HAllocator *mm__, HParser* parser, const void* params
   prog->insns = NULL;
   prog->actions = NULL;
   prog->allocator = mm__;
+  if (setjmp(prog->except)) {
+    return false;
+  }
   if (!h_compile_regex(prog, parser)) {
     h_free(prog->insns);
     h_free(prog->actions);
     h_free(prog);
     return 2;
   }
+  memset(prog->except, 0, sizeof(prog->except));
   h_rvm_insert_insn(prog, RVM_ACCEPT, 0);
   parser->backend_data = prog;
   return 0;
-- 
GitLab