From 2873e76d929e0c1e244278b952af5ae8a77bd705 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 25 May 2012 22:56:13 -0500 Subject: [PATCH] Prevent tdm crash if window manager or compositor do not start (cherry picked from commit 8a80c7f3df3a7ce18398e00f2c91bf65b2325107) --- kdm/kfrontend/kgapp.cpp | 48 ++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/kdm/kfrontend/kgapp.cpp b/kdm/kfrontend/kgapp.cpp index 8d4864669..fef599488 100644 --- a/kdm/kfrontend/kgapp.cpp +++ b/kdm/kfrontend/kgapp.cpp @@ -452,33 +452,37 @@ kg_main( const char *argv0 ) KGVerify::done(); if (comp) { - if (_compositor == "kompmgr") { - // Change process UID - // Get user UID - passwd* userinfo = getpwnam(login_user.ascii()); - if (userinfo) { - TQString newuid = TQString("%1").arg(userinfo->pw_uid); - // kompmgr allows us to change its uid in this manner: - // 1.) Send SIGUSER1 - // 2.) Send the new UID to it on the command line - comp->kill(SIGUSR1); - comp->writeStdin(newuid.ascii(), newuid.length()); - usleep(50000); // Give the above function some time to execute. Note that on REALLY slow systems this could fail, leaving kompmgr running as root. TODO: Look into ways to make this more robust. + if (comp->isRunning()) { + if (_compositor == "kompmgr") { + // Change process UID + // Get user UID + passwd* userinfo = getpwnam(login_user.ascii()); + if (userinfo) { + TQString newuid = TQString("%1").arg(userinfo->pw_uid); + // kompmgr allows us to change its uid in this manner: + // 1.) Send SIGUSER1 + // 2.) Send the new UID to it on the command line + comp->kill(SIGUSR1); + comp->writeStdin(newuid.ascii(), newuid.length()); + usleep(50000); // Give the above function some time to execute. Note that on REALLY slow systems this could fail, leaving kompmgr running as root. TODO: Look into ways to make this more robust. + } } + comp->closeStdin(); + comp->detach(); } - comp->closeStdin(); - comp->detach(); delete comp; } if (kwin) { - if (login_session_wm.endsWith("/startkde") || (login_session_wm == "failsafe")) { - kwin->closeStdin(); - kwin->detach(); - dcop->detach(); - } - else { - kwin->kill(); - dcop->kill(); + if (kwin->isRunning()) { + if (login_session_wm.endsWith("/startkde") || (login_session_wm == "failsafe")) { + kwin->closeStdin(); + kwin->detach(); + dcop->detach(); + } + else { + kwin->kill(); + dcop->kill(); + } } delete kwin; delete dcop;