From 4037c981ebb6455e6631c2a9c79800bce325b9e2 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 1 Nov 2011 18:22:46 -0700 Subject: [PATCH] vm: die if we fault in a fault --- vm/errors.cpp | 6 ++++++ vm/vm.cpp | 3 ++- vm/vm.hpp | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/vm/errors.cpp b/vm/errors.cpp index bbf02c2db2..dcc3a54eb2 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -29,6 +29,8 @@ void out_of_memory() void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) { + faulting_p = true; + /* Reset local roots before allocating anything */ data_roots.clear(); bignum_roots.clear(); @@ -57,6 +59,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) ctx->push(error_object); + faulting_p = false; unwind_native_frames(special_objects[ERROR_HANDLER_QUOT], ctx->callstack_top); } @@ -68,6 +71,7 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) std::cout << "error: " << error << std::endl; std::cout << "arg 1: "; print_obj(arg1); std::cout << std::endl; std::cout << "arg 2: "; print_obj(arg2); std::cout << std::endl; + faulting_p = false; factorbug(); } } @@ -86,6 +90,8 @@ void factor_vm::memory_protection_error(cell addr) { if(code->safepoint_p(addr)) handle_safepoint(); + else if(faulting_p) + fatal_error("Double fault", 0); else if(ctx->datastack_seg->underflow_p(addr)) general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object); else if(ctx->datastack_seg->overflow_p(addr)) diff --git a/vm/vm.cpp b/vm/vm.cpp index 287db660e5..0f921e76a0 100755 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -18,7 +18,8 @@ factor_vm::factor_vm() : fep_disabled(false), full_output(false), last_nano_count(0), - signal_callstack_seg(NULL) + signal_callstack_seg(NULL), + faulting_p(false) { primitive_reset_dispatch_stats(); } diff --git a/vm/vm.hpp b/vm/vm.hpp index a167e487e5..f4c765d645 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -134,6 +134,9 @@ struct factor_vm /* Stack for signal handlers, only used on Unix */ segment *signal_callstack_seg; + /* Are we already handling a fault? Used to catch double memory faults */ + bool faulting_p; + // contexts context *new_context(); void init_context(context *ctx);