Branch: master

ab8dfbaa 2015-04-13 15:05:11 Timothy Pearson
Do not unblock signals in main thread when waiting for kdesktop_lock response
This prevents incorrect cancellation of internal xcb poll() methods and subsequent deadlock
M kdesktop/lock/lockprocess.cc
M kdesktop/lockeng.cc
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index 85de4e0..37d2b88 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -2092,7 +2092,6 @@
 		setGeometry(0, 0, mRootWidth, mRootHeight);
 		erase();
 	}
-//	saverReadyIfNeeded();
 }
 
 void LockProcess::preparePopup()
diff --git a/kdesktop/lockeng.cc b/kdesktop/lockeng.cc
index 27b57bc..43930e9 100644
--- a/kdesktop/lockeng.cc
+++ b/kdesktop/lockeng.cc
@@ -837,15 +837,13 @@
 	sigset_t empty_mask;
 	sigemptyset(&empty_mask);
 
-	// wait for SIGUSR1, SIGUSR2, SIGTTIN, SIGCHLD
+	// ensure that SIGCHLD is not subjec to a race condition
 	sigemptyset(&new_mask);
-	sigaddset(&new_mask, SIGUSR1);
-	sigaddset(&new_mask, SIGUSR2);
-	sigaddset(&new_mask, SIGTTIN);
 	sigaddset(&new_mask, SIGCHLD);
 
 	pthread_sigmask(SIG_BLOCK, &new_mask, NULL);
 	while ((mLockProcess.isRunning()) && (!mSaverProcessReady)) {
+		// wait for any signal to arrive
 		sigsuspend(&empty_mask);
 	}
 	pthread_sigmask(SIG_UNBLOCK, &new_mask, NULL);
@@ -858,11 +856,10 @@
 	sigemptyset(&empty_mask);
 
 	// wait for SIGUSR1, SIGUSR2, SIGTTIN
-	pthread_sigmask(SIG_BLOCK, &mThreadBlockSet, NULL);
 	while ((mLockProcess.isRunning()) && (mState != Waiting) && (mState != Saving)) {
+		// wait for any signal to arrive
 		sigsuspend(&empty_mask);
 	}
-	pthread_sigmask(SIG_UNBLOCK, &mThreadBlockSet, NULL);
 
 	return mLockProcess.isRunning();
 }
@@ -882,4 +879,4 @@
 	if (eventLoop) {
 		eventLoop->exit(0);
 	}
-}
\ No newline at end of file
+}