summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kdesktop/lock/lockprocess.cpp53
-rw-r--r--kdesktop/lock/main.cpp38
-rw-r--r--kdesktop/lockeng.cpp11
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;