summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-12-03 00:55:19 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-12-03 00:55:19 +0900
commit56a93a3357ab9f50a4105980e0b4d39e7d400e3b (patch)
tree4ab92fec28da07e7176cd72a37aff74a0047e4e3 /src/codegen.c
parent155f3909f0a5aaf75cdc8ad3b54a666ac86c8d2f (diff)
downloadmruby-56a93a3357ab9f50a4105980e0b4d39e7d400e3b.tar.gz
mruby-56a93a3357ab9f50a4105980e0b4d39e7d400e3b.zip
should not access scope after releasing memory pool
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 1aa14ef46..7f7ba52f0 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -87,12 +87,14 @@ static void codegen(codegen_scope *s, node *tree, int val);
static void
codegen_error(codegen_scope *s, const char *message)
{
+ jmp_buf jmp;
+
if (!s) return;
while (s->prev) {
+ codegen_scope *tmp = s->prev;
mrb_pool_close(s->mpool);
- s = s->prev;
+ s = tmp;
}
- mrb_pool_close(s->mpool);
#ifdef ENABLE_STDIO
if (s->filename && s->lineno) {
fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
@@ -101,7 +103,9 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "codegen error: %s\n", message);
}
#endif
- longjmp(s->jmp, 1);
+ memcpy(&jmp, &s->jmp, sizeof(jmp_buf));
+ mrb_pool_close(s->mpool);
+ longjmp(jmp, 1);
}
static void*