diff options
-rw-r--r-- | kdesktop/lock/lockprocess.cpp | 53 | ||||
-rw-r--r-- | kdesktop/lock/main.cpp | 38 | ||||
-rw-r--r-- | kdesktop/lockeng.cpp | 11 |
3 files changed, 37 insertions, 65 deletions
diff --git a/kdesktop/lock/lockprocess.cpp b/kdesktop/lock/lockprocess.cpp index 48af0496e..2ad89f5ab 100644 --- a/kdesktop/lock/lockprocess.cpp +++ b/kdesktop/lock/lockprocess.cpp @@ -160,8 +160,6 @@ extern bool trinity_desktop_lock_hide_cancel_button; extern bool trinity_desktop_lock_forced; extern bool trinity_desktop_lock_failed_grab; -extern LockProcess* trinity_desktop_lock_process; - extern bool argb_visual; extern pid_t kdesktop_pid; @@ -171,12 +169,6 @@ bool trinity_desktop_lock_autohide_lockdlg = true; static void segv_handler(int) { - // Try to send a USR1 signal to kdesktop to make sure it does not get - // stuck into an `Engaging` state in case kdesktop_lock crashes. - // This prevents the locking mechanism from becaming unresponsive - // in case of exceptions. - kill(kdesktop_pid, SIGUSR1); - kdError(KDESKTOP_DEBUG_ID) << "A fatal exception was encountered." << " Trapping and ignoring it so as not to compromise desktop security..." << kdBacktrace() << endl; @@ -456,12 +448,10 @@ static int signal_pipe[2]; static void sigterm_handler(int) { - if ((!trinity_desktop_lock_process) || (!trinity_desktop_lock_process->inSecureDialog())) { - // Exit uncleanly - char tmp = 'U'; - if (::write( signal_pipe[1], &tmp, 1) == -1) { - // Error handler to shut up gcc warnings - } + // Exit uncleanly + char tmp = 'U'; + if (::write( signal_pipe[1], &tmp, 1) == -1) { + // Error handler to shut up gcc warnings } } @@ -564,9 +554,11 @@ void LockProcess::signalPipeSignal() startLock(); } else if( tmp == 'U' ) { - // Exit uncleanly - quitSaver(); - exit(1); + if (!inSecureDialog()) { + // Exit uncleanly + quitSaver(); + exit(1); + } } } @@ -1383,7 +1375,8 @@ bool LockProcess::startSaver(bool notify_ready) slotPaintBackground(rootWinSnapShot); } - if (((!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) && (!mInSecureDialog)) && (mHackStartupEnabled || mOverrideHackStartupEnabled)) { + if (!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) && !mInSecureDialog && + (mHackStartupEnabled || mOverrideHackStartupEnabled)) { if (argb_visual) { setTransparentBackgroundARGB(); } @@ -1410,7 +1403,7 @@ bool LockProcess::startSaver(bool notify_ready) } } - if (mInSecureDialog == false) { + if (!mInSecureDialog) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { ENABLE_CONTINUOUS_LOCKDLG_DISPLAY if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, true); @@ -1804,19 +1797,17 @@ void LockProcess::displayLockDialogIfNeeded() m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog = NULL; } - if (!mInSecureDialog) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - if (!mBusy) { - mBusy = true; - if (mLocked) { - if (checkPass()) { - mClosingWindows = true; - stopSaver(); - tdeApp->quit(); - } + if (!mInSecureDialog && trinity_desktop_lock_use_system_modal_dialogs) { + if (!mBusy) { + mBusy = true; + if (mLocked) { + if (checkPass()) { + mClosingWindows = true; + stopSaver(); + tdeApp->quit(); } - mBusy = false; } + mBusy = false; } } } @@ -2218,7 +2209,7 @@ bool LockProcess::x11Event(XEvent *event) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, true); } } - if ((!mLocked) && (!mInSecureDialog)) { + if (!mLocked && !mInSecureDialog) { stopSaver(); tdeApp->quit(); } diff --git a/kdesktop/lock/main.cpp b/kdesktop/lock/main.cpp index 090d4ae6e..9f707c35d 100644 --- a/kdesktop/lock/main.cpp +++ b/kdesktop/lock/main.cpp @@ -67,8 +67,6 @@ bool trinity_desktop_lock_forced = false; // This is a temporary variable used till a fix for the grab issue is prepared bool trinity_desktop_lock_failed_grab = false; -LockProcess* trinity_desktop_lock_process = nullptr; - bool signalled_forcelock; bool signalled_dontlock; bool signalled_securedialog; @@ -222,19 +220,6 @@ void restore_hidden_override_redirect_windows() { } } -static void shutdown_lock_process(bool unclean) -{ - if (unclean) - { - // Send a USR1 signal to kdesktop to make sure it does not get stuck into - // an `Engaging` state in case kdesktop_lock activation failed. This prevents - // the locking mechanism from becaming unresponsive in case of exceptions. - kill(kdesktop_pid, SIGUSR1); - } - delete trinity_desktop_lock_process; - trinity_desktop_lock_process = nullptr; -} - // ----------------------------------------------------------------------------- int main( int argc, char **argv ) @@ -396,7 +381,7 @@ int main( int argc, char **argv ) tdmconfig->setGroup("X-:*-Greeter"); // Create new LockProcess, which also spawns threads inheriting the blocked signal mask - trinity_desktop_lock_process = new LockProcess; + LockProcess lock_process; // Unblock reception of all signals in this thread sigprocmask(SIG_UNBLOCK, &new_mask, NULL); @@ -510,34 +495,33 @@ int main( int argc, char **argv ) trinity_desktop_lock_forced = true; } - trinity_desktop_lock_process->init(child, (args->isSet( "blank" ) || signalled_blank)); + lock_process.init(child, (args->isSet( "blank" ) || signalled_blank)); if (!child) { - trinity_desktop_lock_process->setChildren(child_sockets); + lock_process.setChildren(child_sockets); } else { - trinity_desktop_lock_process->setParent(parent_connection); + lock_process.setParent(parent_connection); } trinity_desktop_lock_failed_grab = false; bool rt; if( (!child && args->isSet( "forcelock" )) || signalled_forcelock) { - rt = trinity_desktop_lock_process->lock(); + rt = lock_process.lock(); } else if( child || (args->isSet( "dontlock" ) || signalled_dontlock)) { - rt = trinity_desktop_lock_process->dontLock(); + rt = lock_process.dontLock(); } else if( child || (args->isSet( "securedialog" ) || signalled_securedialog)) { int retcode = tde_sak_verify_calling_process(); if (retcode == 0) { - rt = trinity_desktop_lock_process->runSecureDialog(); + rt = lock_process.runSecureDialog(); } else { - shutdown_lock_process(true); return 1; } } else { - rt = trinity_desktop_lock_process->defaultSave(); + rt = lock_process.defaultSave(); } // Make sure to handle all pending responses from the X server. @@ -551,7 +535,6 @@ int main( int argc, char **argv ) app->processEvents(); if (!rt) { - shutdown_lock_process(true); return (trinity_desktop_lock_failed_grab ? 0 : 12); } @@ -559,13 +542,11 @@ int main( int argc, char **argv ) trinity_desktop_lock_hidden_window_list.clear(); int ret = app->exec(); restore_hidden_override_redirect_windows(); - shutdown_lock_process(false); return ret; } else { if (kill(kdesktop_pid, 0) < 0) { // The controlling kdesktop process probably died. Commit suicide... - shutdown_lock_process(true); return 12; } trinity_desktop_lock_hidden_window_list.clear(); @@ -573,12 +554,9 @@ int main( int argc, char **argv ) restore_hidden_override_redirect_windows(); if (kill(kdesktop_pid, SIGUSR1) < 0) { // The controlling kdesktop process probably died. Commit suicide... - shutdown_lock_process(true); return 12; } - shutdown_lock_process(false); - // FIXME // We should not have to return (restart) at all, // but it seems that some X11 connections are left active, diff --git a/kdesktop/lockeng.cpp b/kdesktop/lockeng.cpp index 57a42c9b5..fc3c9db6e 100644 --- a/kdesktop/lockeng.cpp +++ b/kdesktop/lockeng.cpp @@ -732,16 +732,16 @@ void SaverEngineEventHandler::lockCompleted() { kdDebug(1204) << "SaverEngineEventHandler: lock completed" << endl; - if (trinity_lockeng_sak_available) - { - startSAKProcess(); - } if (m_state == Waiting) { return; } m_state = Waiting; + if (trinity_lockeng_sak_available) + { + startSAKProcess(); + } TQTimer::singleShot(0, m_saverEngine, TQ_SLOT(stopLockProcessGUI())); } @@ -797,6 +797,9 @@ void SaverEngineEventHandler::saveScreen() void SaverEngineEventHandler::slotLockProcessExited() { + // Clean up status after the lock process has exited + lockCompleted(); + m_lockProcessRestarting = true; bool abnormalExit = false; |