From 3479e850c550ae1e182c7b62efa3fd09d3f6cbd1 Mon Sep 17 00:00:00 2001 From: luly81 Date: Thu, 29 Mar 2007 01:32:39 +0000 Subject: Fix issue 136. Block signals before writing minidumps. git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@134 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/client/linux/handler/exception_handler.cc | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/client/linux/handler') diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc index 59b50df7..eb7cbce2 100644 --- a/src/client/linux/handler/exception_handler.cc +++ b/src/client/linux/handler/exception_handler.cc @@ -214,7 +214,7 @@ void ExceptionHandler::HandleException(int signo) { bool ExceptionHandler::InternalWriteMinidump(int signo, const struct sigcontext *sig_ctx) { if (filter_ && !filter_(callback_context_)) - return false; + return false; GUID guid; bool success = false;; @@ -224,8 +224,28 @@ bool ExceptionHandler::InternalWriteMinidump(int signo, snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", dump_path_c_, guid_str); + + // Block all the signals we want to process when writting minidump. + // We don't want it to be interrupted. + sigset_t sig_blocked, sig_old; + bool blocked = true; + sigfillset(&sig_blocked); + for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) + sigdelset(&sig_blocked, SigTable[i]); + if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) { + blocked = false; + fprintf(stderr, "google_breakpad::ExceptionHandler::HandleException: " + "failed to block signals.\n"); + } + success = minidump_generator_.WriteMinidumpToFile( minidump_path, signo, sig_ctx); + + // Unblock the signals. + if (blocked) { + sigprocmask(SIG_SETMASK, &sig_old, &sig_old); + } + if (callback_) success = callback_(dump_path_c_, guid_str, callback_context_, success); -- cgit v1.2.1