diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-03 00:55:19 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-03 00:55:19 +0900 |
| commit | 56a93a3357ab9f50a4105980e0b4d39e7d400e3b (patch) | |
| tree | 4ab92fec28da07e7176cd72a37aff74a0047e4e3 /src/codegen.c | |
| parent | 155f3909f0a5aaf75cdc8ad3b54a666ac86c8d2f (diff) | |
| download | mruby-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.c | 10 |
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* |
