|
|
1.1 ! root 1: /* ! 2: Copyright (c) 2008 TrueCrypt Foundation. All rights reserved. ! 3: ! 4: Governed by the TrueCrypt License 2.4 the full text of which is contained ! 5: in the file License.txt included in TrueCrypt binary and source code ! 6: distribution packages. ! 7: */ ! 8: ! 9: #include "System.h" ! 10: #include <wx/stackwalk.h> ! 11: ! 12: #include "Main.h" ! 13: #include "UserInterface.h" ! 14: #include "GraphicUserInterface.h" ! 15: ! 16: #ifdef TC_UNIX ! 17: #include <signal.h> ! 18: #endif ! 19: ! 20: #ifdef TC_MACOSX ! 21: # ifdef __ppc__ ! 22: # include <ppc/ucontext.h> ! 23: # else ! 24: # include <i386/ucontext.h> ! 25: # endif ! 26: #endif ! 27: ! 28: #include "FatalErrorHandler.h" ! 29: ! 30: namespace TrueCrypt ! 31: { ! 32: static terminate_handler DefaultTerminateHandler; ! 33: ! 34: struct FatalErrorReport ! 35: { ! 36: bool UnhandledException; ! 37: }; ! 38: ! 39: #ifdef TC_UNIX ! 40: static void OnFatalProgramErrorSignal (int, siginfo_t *signalInfo, void *contextArg) ! 41: { ! 42: ucontext_t *context = (ucontext_t *) contextArg; ! 43: uint64 faultingInstructionAddress = 0; ! 44: ! 45: #ifdef TC_LINUX ! 46: # ifdef REG_EIP ! 47: faultingInstructionAddress = context->uc_mcontext.gregs[REG_EIP]; ! 48: # elif defined (REG_RIP) ! 49: faultingInstructionAddress = context->uc_mcontext.gregs[REG_RIP]; ! 50: # endif ! 51: ! 52: #elif defined (TC_MACOSX) ! 53: # ifdef __ppc__ ! 54: faultingInstructionAddress = context->uc_mcontext->ss.srr0; ! 55: # elif defined (__x86_64__) ! 56: faultingInstructionAddress = context->uc_mcontext->ss.rip; ! 57: # else ! 58: faultingInstructionAddress = context->uc_mcontext->ss.eip; ! 59: # endif ! 60: ! 61: #endif ! 62: ! 63: wstringstream vars; ! 64: vars << L"err=" << signalInfo->si_signo; ! 65: vars << L"&addr=" << hex << faultingInstructionAddress << dec; ! 66: ! 67: #if wxUSE_STACKWALKER == 1 ! 68: ! 69: class StackWalker : public wxStackWalker ! 70: { ! 71: public: ! 72: StackWalker () : FrameCount (0) { } ! 73: ! 74: void OnStackFrame (const wxStackFrame &frame) ! 75: { ! 76: if (FrameCount > 8) ! 77: return; ! 78: ! 79: StackVars << L"&st" << FrameCount++ << L"=" << hex << frame.GetAddress(); ! 80: } ! 81: ! 82: int FrameCount; ! 83: wstringstream StackVars; ! 84: }; ! 85: ! 86: StackWalker stackWalker; ! 87: stackWalker.Walk (1); ! 88: if (!stackWalker.StackVars.str().empty()) ! 89: vars << stackWalker.StackVars.str(); ! 90: ! 91: #endif // wxUSE_STACKWALKER ! 92: ! 93: wxString url = Gui->GetHomepageLinkURL (L"err-report", vars.str()); ! 94: url.Replace (L"0x", L""); ! 95: ! 96: wxString msg = L"A critical error has occured and TrueCrypt must be terminated. If this is caused by a bug in TrueCrypt, we would like to fix it. To help us, you can send us an automatically generated error report containing the following items:\n\n- Program version\n- Operating system version\n- Hardware architecture\n- Error category\n- Error address\n"; ! 97: #if wxUSE_STACKWALKER == 1 ! 98: msg += L"- TrueCrypt call stack\n"; ! 99: #endif ! 100: msg += L"\nIf you select 'Yes', the following URL (which contains the entire error report) will be opened in your default Internet browser.\n\n"; ! 101: #ifdef __WXGTK__ ! 102: wxString fUrl = url; ! 103: fUrl.Replace (L"&st", L" &st"); ! 104: msg += fUrl; ! 105: #else ! 106: msg += url; ! 107: #endif ! 108: msg += L"\n\nDo you want to send us the error report?"; ! 109: ! 110: if (Gui->AskYesNo (msg, true)) ! 111: wxLaunchDefaultBrowser (url, wxBROWSER_NEW_WINDOW); ! 112: ! 113: _exit (1); ! 114: } ! 115: #endif // TC_UNIX ! 116: ! 117: void FatalErrorHandler::Deregister() ! 118: { ! 119: #ifdef TC_UNIX ! 120: signal (SIGILL, SIG_DFL); ! 121: signal (SIGFPE, SIG_DFL); ! 122: signal (SIGSEGV, SIG_DFL); ! 123: signal (SIGBUS, SIG_DFL); ! 124: signal (SIGSYS, SIG_DFL); ! 125: #endif ! 126: ! 127: #ifndef TC_WINDOWS ! 128: std::set_terminate (DefaultTerminateHandler); ! 129: #endif ! 130: } ! 131: ! 132: void FatalErrorHandler::OnTerminate () ! 133: { ! 134: try ! 135: { ! 136: throw; ! 137: } ! 138: catch (UserAbort&) ! 139: { ! 140: } ! 141: catch (Exception &e) ! 142: { ! 143: wxString vars; ! 144: ! 145: wxString exName = StringConverter::ToWide (StringConverter::GetTypeName (typeid (e))); ! 146: if (exName.find (L"TrueCrypt::") != string::npos) ! 147: exName = exName.Mid (11); ! 148: ! 149: wxString exPos = StringConverter::ToWide (e.what()); ! 150: if (exPos.find (L"TrueCrypt::") != string::npos) ! 151: exPos = exPos.Mid (11); ! 152: ! 153: vars << L"&exception=" << exName; ! 154: vars << L"&exlocation=" << exPos; ! 155: vars.Replace (L"::", L"."); ! 156: vars.Replace (L":", L"."); ! 157: ! 158: wxString url = Gui->GetHomepageLinkURL (L"err-report", vars); ! 159: ! 160: wxString msg = L"An unhandled exception has occured and TrueCrypt must be terminated. If this is caused by a bug in TrueCrypt, we would like to fix it. To help us, you can send us an automatically generated error report containing the following items:\n\n- Program version\n- Operating system version\n- Hardware architecture\n- Error description\n- Error location\n"; ! 161: msg += L"\nIf you select 'Yes', the following URL (which contains the entire error report) will be opened in your default Internet browser.\n\n"; ! 162: msg += url; ! 163: msg += L"\n\nDo you want to send us the error report?"; ! 164: ! 165: if (Gui->AskYesNo (msg, true)) ! 166: wxLaunchDefaultBrowser (url, wxBROWSER_NEW_WINDOW); ! 167: ! 168: } ! 169: catch (exception &e) ! 170: { ! 171: Gui->ShowError (e); ! 172: } ! 173: catch (...) ! 174: { ! 175: Gui->ShowError (_("Unknown exception occurred.")); ! 176: } ! 177: ! 178: _exit (1); ! 179: } ! 180: ! 181: void FatalErrorHandler::Register () ! 182: { ! 183: #ifndef TC_WINDOWS ! 184: // OnUnhandledException() seems to be called only on Windows ! 185: DefaultTerminateHandler = std::set_terminate (OnTerminate); ! 186: #endif ! 187: ! 188: #ifdef TC_UNIX ! 189: struct sigaction action; ! 190: Memory::Zero (&action, sizeof (action)); ! 191: action.sa_flags = SA_SIGINFO; ! 192: action.sa_sigaction = OnFatalProgramErrorSignal; ! 193: ! 194: throw_sys_if (sigaction (SIGILL, &action, nullptr) == -1); ! 195: throw_sys_if (sigaction (SIGFPE, &action, nullptr) == -1); ! 196: throw_sys_if (sigaction (SIGSEGV, &action, nullptr) == -1); ! 197: throw_sys_if (sigaction (SIGBUS, &action, nullptr) == -1); ! 198: throw_sys_if (sigaction (SIGSYS, &action, nullptr) == -1); ! 199: #endif ! 200: } ! 201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.