diff --git a/src/lib/arch/XArch.h b/src/lib/arch/XArch.h index da2feaa74..954cae1b5 100644 --- a/src/lib/arch/XArch.h +++ b/src/lib/arch/XArch.h @@ -46,24 +46,14 @@ cleanup but before leaving or returning from the handler. } catch (...) { \ } -//! Generic exception architecture dependent library -class XArch : public std::runtime_error -{ -public: - explicit XArch(const std::string &msg) : std::runtime_error(msg) - { - } - ~XArch() throw() override = default; -}; - //! Generic network exception /*! Exceptions derived from this class are used by the networking library to indicate various errors. */ -class XArchNetwork : public XArch +class XArchNetwork : public std::runtime_error { - using XArch::XArch; + using std::runtime_error::runtime_error; }; //! Operation was interrupted @@ -185,9 +175,9 @@ class XArchNetworkNameUnsupported : public XArchNetworkName Exceptions derived from this class are used by the daemon library to indicate various errors. */ -class XArchDaemon : public XArch +class XArchDaemon : public std::runtime_error { - using XArch::XArch; + using std::runtime_error::runtime_error; }; //! Could not daemonize diff --git a/src/lib/arch/win32/ArchMiscWindows.cpp b/src/lib/arch/win32/ArchMiscWindows.cpp index 2348a95b2..607a42ce2 100644 --- a/src/lib/arch/win32/ArchMiscWindows.cpp +++ b/src/lib/arch/win32/ArchMiscWindows.cpp @@ -410,7 +410,7 @@ std::string ArchMiscWindows::getActiveDesktopName() HDESK desk = OpenInputDesktop(0, TRUE, GENERIC_READ); if (desk == nullptr) { LOG((CLOG_ERR "could not open input desktop")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } DWORD size; @@ -531,7 +531,7 @@ bool ArchMiscWindows::isProcessElevated() HANDLE hToken = nullptr; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } TOKEN_ELEVATION elevation; @@ -539,7 +539,7 @@ bool ArchMiscWindows::isProcessElevated() try { DWORD dwSize = sizeof(TOKEN_ELEVATION); if (!GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize)) { - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } catch (...) { CloseHandle(hToken); diff --git a/src/lib/deskflow/win32/AppUtilWindows.cpp b/src/lib/deskflow/win32/AppUtilWindows.cpp index 244290884..8f4b27310 100644 --- a/src/lib/deskflow/win32/AppUtilWindows.cpp +++ b/src/lib/deskflow/win32/AppUtilWindows.cpp @@ -29,7 +29,7 @@ AppUtilWindows::AppUtilWindows(IEventQueue *events) : m_events(events), m_exitMode(kExitModeNormal) { if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)consoleHandler, TRUE) == FALSE) { - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } m_eventThread = std::thread(&AppUtilWindows::eventLoop, this); // NOSONAR - No jthread on Windows @@ -192,7 +192,7 @@ void AppUtilWindows::eventLoop() HANDLE hCloseEvent = CreateEventA(nullptr, TRUE, FALSE, kCloseEventName); if (!hCloseEvent) { LOG_CRIT("failed to create event for windows event loop"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG_DEBUG("windows event loop running"); diff --git a/src/lib/platform/MSWindowsProcess.cpp b/src/lib/platform/MSWindowsProcess.cpp index e7585e6d4..0e6a54455 100644 --- a/src/lib/platform/MSWindowsProcess.cpp +++ b/src/lib/platform/MSWindowsProcess.cpp @@ -61,7 +61,7 @@ BOOL MSWindowsProcess::startAsUser(HANDLE userToken, LPSECURITY_ATTRIBUTES sa) LPVOID environment; if (!CreateEnvironmentBlock(&environment, userToken, FALSE)) { LOG((CLOG_ERR "could not create environment block")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } ZeroMemory(&m_info, sizeof(PROCESS_INFORMATION)); @@ -96,13 +96,13 @@ DWORD MSWindowsProcess::waitForExit() if (WaitForSingleObject(m_info.hProcess, kMaxWaitMilliseconds) != WAIT_OBJECT_0) { LOG_ERR("process did not exit within the expected time"); TerminateProcess(m_info.hProcess, 1); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } DWORD exitCode = 0; if (!GetExitCodeProcess(m_info.hProcess, &exitCode)) { LOG_ERR("failed to get exit code, error: %lu", GetLastError()); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } if (exitCode != 0) { @@ -195,22 +195,22 @@ void MSWindowsProcess::createPipes() if (!CreatePipe(&m_outputPipe, &m_stdOutput, &saAttr, 0)) { LOG_ERR("could not create output pipe"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } if (!CreatePipe(&m_errorPipe, &m_stdError, &saAttr, 0)) { LOG_ERR("could not create error pipe"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } // Set the pipes to non-blocking mode DWORD mode = PIPE_NOWAIT; if (!SetNamedPipeHandleState(m_outputPipe, &mode, nullptr, nullptr)) { - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } if (!SetNamedPipeHandleState(m_errorPipe, &mode, nullptr, nullptr)) { - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } @@ -236,7 +236,7 @@ std::string MSWindowsProcess::readOutput(HANDLE handle) // Check if there is data available in the pipe, which prevents `ReadFile` from freezing execution. if (!PeekNamedPipe(handle, nullptr, 0, nullptr, &totalBytesAvail, &bytesLeftThisMessage)) { LOG_ERR("could not peek into pipe"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } if (totalBytesAvail == 0) { @@ -245,7 +245,7 @@ std::string MSWindowsProcess::readOutput(HANDLE handle) if (!ReadFile(handle, buffer, kOutputBufferSize, &bytesRead, nullptr)) { LOG_ERR("could not read from pipe"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } return std::string(buffer, bytesRead); diff --git a/src/lib/platform/MSWindowsSession.cpp b/src/lib/platform/MSWindowsSession.cpp index afabf8e3c..2e6763f95 100644 --- a/src/lib/platform/MSWindowsSession.cpp +++ b/src/lib/platform/MSWindowsSession.cpp @@ -23,7 +23,7 @@ bool MSWindowsSession::isProcessInSession(const char *name, PHANDLE process = nu HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot == INVALID_HANDLE_VALUE) { LOG((CLOG_ERR "could not get process snapshot")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } PROCESSENTRY32 entry; @@ -34,7 +34,7 @@ bool MSWindowsSession::isProcessInSession(const char *name, PHANDLE process = nu BOOL gotEntry = Process32First(snapshot, &entry); if (!gotEntry) { LOG((CLOG_ERR "could not get first process entry")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } // used to record process names for debug info @@ -106,7 +106,7 @@ MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security) HANDLE sourceToken; if (!WTSQueryUserToken(m_activeSessionId, &sourceToken)) { LOG((CLOG_ERR "could not get token from session %d", m_activeSessionId)); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } HANDLE newToken; @@ -115,7 +115,7 @@ MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security) )) { LOG((CLOG_ERR "could not duplicate token")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG((CLOG_DEBUG "duplicated, new token: %i", newToken)); @@ -149,7 +149,7 @@ BOOL MSWindowsSession::nextProcessEntry(HANDLE snapshot, LPPROCESSENTRY32 entry) // files' error then it's probably something serious. if (err != ERROR_NO_MORE_FILES) { LOG((CLOG_ERR "could not get next process entry")); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index e8c6ad910..f466096f6 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -67,7 +67,7 @@ HANDLE openProcessForKill(const PROCESSENTRY32 &entry) HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); if (handle == nullptr) { LOG_ERR("could not open process handle for kill"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } // only shut down if not current process (daemon is now the same unified binary). @@ -126,7 +126,7 @@ MSWindowsWatchdog::duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES s if (!tokenRet) { LOG_ERR("could not open token, process handle: %d", process); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG_DEBUG("got token %i, duplicating", sourceToken); @@ -138,7 +138,7 @@ MSWindowsWatchdog::duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES s if (!duplicateRet) { LOG_ERR("could not duplicate token %i", sourceToken); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG_DEBUG("duplicated, new token: %i", newToken); @@ -156,12 +156,12 @@ MSWindowsWatchdog::getUserToken(LPSECURITY_ATTRIBUTES security, bool elevatedTok HANDLE process; if (!m_session.isProcessInSession("winlogon.exe", &process)) { - throw XArch("cannot get user token without winlogon.exe"); + throw std::runtime_error("cannot get user token without winlogon.exe"); } try { return duplicateProcessToken(process, security); - } catch (XArch &e) { + } catch (std::runtime_error &e) { LOG_ERR("failed to duplicate user token from winlogon.exe"); CloseHandle(process); throw e; @@ -269,7 +269,7 @@ bool MSWindowsWatchdog::isProcessRunning() void MSWindowsWatchdog::startProcess() { if (m_command.empty()) { - throw XArch("cannot start process, command is empty"); + throw std::runtime_error("cannot start process, command is empty"); } if (m_process != nullptr) { @@ -304,7 +304,7 @@ void MSWindowsWatchdog::startProcess() LOG_ERR("daemon failed to run command, exit code: %d", exitCode); } else { LOG_ERR("daemon failed to run command, unknown exit code"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } else { // Wait for program to fail. This needs to be 1 second, as the process may take some time to fail. @@ -313,7 +313,7 @@ void MSWindowsWatchdog::startProcess() if (!isProcessRunning()) { m_process.reset(); - throw XArch("process immediately stopped"); + throw std::runtime_error("process immediately stopped"); } LOG_DEBUG("started core process from watchdog"); @@ -388,7 +388,7 @@ void MSWindowsWatchdog::shutdownExistingProcesses() HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, kAllProcesses); if (snapshot == INVALID_HANDLE_VALUE) { LOG_ERR("could not get process snapshot"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } PROCESSENTRY32 entry; @@ -399,7 +399,7 @@ void MSWindowsWatchdog::shutdownExistingProcesses() BOOL gotEntry = Process32First(snapshot, &entry); if (!gotEntry) { LOG_ERR("could not get first process entry"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } // now just iterate until we can find winlogon.exe pid @@ -420,7 +420,7 @@ void MSWindowsWatchdog::shutdownExistingProcesses() // only worry about error if it's not the end of the snapshot LOG_ERR("could not get next process entry"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } } @@ -482,14 +482,14 @@ void MSWindowsWatchdog::initOutputReadPipe() if (!CreatePipe(&m_outputReadPipe, &m_outputWritePipe, &saAttr, 0)) { LOG_ERR("could not create output pipe"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } // Set the pipe to non-blocking mode, which allows us to stop the output reader thread immediately // in order to speed up the shutdown process when the Windows service needs to stop. if (DWORD mode = PIPE_NOWAIT; !SetNamedPipeHandleState(m_outputReadPipe, &mode, nullptr, nullptr)) { LOG_ERR("could not set pipe to non-blocking mode"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } } @@ -500,14 +500,14 @@ void MSWindowsWatchdog::initSasFunc() HINSTANCE sasLib = LoadLibrary("sas.dll"); if (!sasLib) { LOG_ERR("could not load sas.dll"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG_DEBUG("loaded sas.dll, used to simulate ctrl-alt-del"); m_sendSasFunc = (SendSas)GetProcAddress(sasLib, "SendSAS"); if (!m_sendSasFunc) { LOG_ERR("could not find SendSAS function in sas.dll"); - throw XArch(windowsErrorToString(GetLastError())); + throw std::runtime_error(windowsErrorToString(GetLastError())); } LOG_DEBUG("found SendSAS function in sas.dll"); @@ -518,7 +518,7 @@ void MSWindowsWatchdog::sasLoop(void *) // NOSONAR - Thread entry point signatur LOG_DEBUG3("watchdog creating sas event"); if (m_sendSasFunc == nullptr) { - throw XArch("SendSAS function not initialized"); + throw std::runtime_error("SendSAS function not initialized"); } while (m_running) { diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm index 74ff819a6..2c34cd8b7 100644 --- a/src/lib/platform/OSXScreen.mm +++ b/src/lib/platform/OSXScreen.mm @@ -122,7 +122,7 @@ OSXScreen::OSXScreen( if (m_isPrimary) { // we can't pass options to show the dialog, this must be done by the gui. if (!AXIsProcessTrusted()) { - throw XArch("assistive devices does not trust this process, allow it in system settings."); + throw std::runtime_error("assistive devices does not trust this process, allow it in system settings."); } } diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index 8a6aede4e..4a2711731 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -104,7 +104,7 @@ XWindowsScreen::XWindowsScreen( if (!disableXInitThreads) { // initializes Xlib support for concurrent threads. if (XInitThreads() == 0) - throw XArch("XInitThreads() returned zero"); + throw std::runtime_error("XInitThreads() returned zero"); } else { LOG((CLOG_DEBUG "skipping XInitThreads()")); }