diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-03-06 12:15:55 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-03-06 12:15:55 +0900 |
| commit | b4d946f6bccffa4cd6b1a89b13cf0a6f76d8f3ff (patch) | |
| tree | 18da5408ccc2a372b859162a386caf754ac36795 /src/error.c | |
| parent | 1a4540fb4aa53ee438b5fa65e28f3ad39537c39e (diff) | |
| parent | f1eb3aea114cbd1e2622cbe9618571f3e1eec115 (diff) | |
| download | mruby-b4d946f6bccffa4cd6b1a89b13cf0a6f76d8f3ff.tar.gz mruby-b4d946f6bccffa4cd6b1a89b13cf0a6f76d8f3ff.zip | |
Merge pull request #3129 from kou/fix-segv-by-backtrace-and-gc
Fix SEGV by backtrace and GC
Diffstat (limited to 'src/error.c')
| -rw-r--r-- | src/error.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/error.c b/src/error.c index 14e4ab4d3..13032b136 100644 --- a/src/error.c +++ b/src/error.c @@ -255,17 +255,22 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc) { if (!mrb->gc.out_of_memory && mrb->backtrace.n > 0) { mrb_value target_exc = mrb_nil_value(); + int ai; + + ai = mrb_gc_arena_save(mrb); if ((mrb->exc && !have_backtrace(mrb, mrb->exc))) { target_exc = mrb_obj_value(mrb->exc); } - else if (!mrb_nil_p(exc) && mrb_obj_ptr(exc) == mrb->backtrace.exc) { - target_exc = exc; + else if (!mrb_nil_p(exc) && mrb->backtrace.exc) { + target_exc = mrb_obj_value(mrb->backtrace.exc); + mrb_gc_protect(mrb, target_exc); } if (!mrb_nil_p(target_exc)) { mrb_value backtrace; backtrace = mrb_restore_backtrace(mrb); set_backtrace(mrb, target_exc, backtrace); } + mrb_gc_arena_restore(mrb, ai); } mrb->backtrace.n = 0; |
