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>
pull/646/head
Michele Calgaro 2 months ago
parent 5e6907dc18
commit 8252927210
Signed by: MicheleC
GPG Key ID: 2A75B7CA8ADED5CF

@ -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,14 +448,12 @@ 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
}
}
}
static void sighup_handler(int)
{
@ -564,11 +554,13 @@ void LockProcess::signalPipeSignal()
startLock();
}
else if( tmp == 'U' ) {
if (!inSecureDialog()) {
// Exit uncleanly
quitSaver();
exit(1);
}
}
}
//---------------------------------------------------------------------------
bool LockProcess::lock()
@ -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,8 +1797,7 @@ void LockProcess::displayLockDialogIfNeeded()
m_startupStatusDialog->closeSMDialog();
m_startupStatusDialog = NULL;
}
if (!mInSecureDialog) {
if (trinity_desktop_lock_use_system_modal_dialogs) {
if (!mInSecureDialog && trinity_desktop_lock_use_system_modal_dialogs) {
if (!mBusy) {
mBusy = true;
if (mLocked) {
@ -1819,7 +1811,6 @@ void LockProcess::displayLockDialogIfNeeded()
}
}
}
}
void LockProcess::suspend()
{
@ -2218,7 +2209,7 @@ bool LockProcess::x11Event(XEvent *event)
mHackDelayStartupTimer->start(mHackDelayStartupTimeout, true);
}
}
if ((!mLocked) && (!mInSecureDialog)) {
if (!mLocked && !mInSecureDialog) {
stopSaver();
tdeApp->quit();
}

@ -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,

@ -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;

Loading…
Cancel
Save