From 8252927210f087b78b5608ee0a2ecd7f05821a5e Mon Sep 17 00:00:00 2001
From: Michele Calgaro <michele.calgaro@yahoo.it>
Date: Mon, 4 Aug 2025 19:25:13 +0900
Subject: kdesktop: simplify lock process code. This ensure correct cleanup in
 case of unexpected termination of the process.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
---
 kdesktop/lock/lockprocess.cpp | 53 ++++++++++++++++++-------------------------
 kdesktop/lock/main.cpp        | 38 +++++++------------------------
 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;
-- 
cgit v1.2.3

