summaryrefslogtreecommitdiffhomepage
path: root/src/error.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-03-06 12:15:55 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-03-06 12:15:55 +0900
commitb4d946f6bccffa4cd6b1a89b13cf0a6f76d8f3ff (patch)
tree18da5408ccc2a372b859162a386caf754ac36795 /src/error.c
parent1a4540fb4aa53ee438b5fa65e28f3ad39537c39e (diff)
parentf1eb3aea114cbd1e2622cbe9618571f3e1eec115 (diff)
downloadmruby-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.c9
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;