kernel: generic user_memcpy now saves the old state.

fixes #14135.
This commit is contained in:
Jérôme Duval
2018-05-16 06:58:33 +00:00
parent a553e95d85
commit c7c3973e09
@@ -21,7 +21,12 @@ namespace {
struct FaultHandlerGuard { struct FaultHandlerGuard {
FaultHandlerGuard() FaultHandlerGuard()
{ {
ASSERT(thread_get_current_thread()->fault_handler == nullptr); old_handler = thread_get_current_thread()->fault_handler;
if (old_handler != nullptr) {
memcpy(old_handler_state,
thread_get_current_thread()->fault_handler_state,
sizeof(jmp_buf));
}
thread_get_current_thread()->fault_handler = HandleFault; thread_get_current_thread()->fault_handler = HandleFault;
std::atomic_signal_fence(std::memory_order_acq_rel); std::atomic_signal_fence(std::memory_order_acq_rel);
} }
@@ -30,7 +35,13 @@ struct FaultHandlerGuard {
~FaultHandlerGuard() ~FaultHandlerGuard()
{ {
std::atomic_signal_fence(std::memory_order_acq_rel); std::atomic_signal_fence(std::memory_order_acq_rel);
thread_get_current_thread()->fault_handler = nullptr; thread_get_current_thread()->fault_handler = old_handler;
if (old_handler != nullptr) {
memcpy(thread_get_current_thread()->fault_handler_state,
old_handler_state,
sizeof(jmp_buf));
}
} }
@@ -38,6 +49,9 @@ struct FaultHandlerGuard {
{ {
longjmp(thread_get_current_thread()->fault_handler_state, 1); longjmp(thread_get_current_thread()->fault_handler_state, 1);
} }
void (*old_handler)(void);
jmp_buf old_handler_state;
}; };