Summary: | Unable to unlock screen on OpenSolaris (snv_106) | ||
---|---|---|---|
Product: | kscreensaver | Reporter: | Jan Hnatek <jan.hnatek> |
Component: | kcheckpass | Assignee: | kscreensaver bugs tracking <kscreensaver-bugs-null> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Solaris Packages | ||
OS: | Solaris | ||
Latest Commit: | Version Fixed In: |
Description
Jan Hnatek
2009-02-15 23:02:25 UTC
Still valid in 4.2.96. Suggested patches: --- kcheckpass/checkpass_pam.c.orig 2008-05-07 11:05:23.000000000 +0200 +++ kcheckpass/checkpass_pam.c 2009-07-18 10:07:07.278635793 +0200 @@ -38,12 +38,12 @@ int classic:1; }; -#ifdef PAM_MESSAGE_NONCONST -typedef struct pam_message pam_message_type; -typedef void *pam_gi_type; -#else +#ifdef PAM_MESSAGE_CONST typedef const struct pam_message pam_message_type; typedef const void *pam_gi_type; +#else +typedef struct pam_message pam_message_type; +typedef void *pam_gi_type; #endif static int $ svn diff kdebase/workspace/README.pam Index: kdebase/workspace/README.pam =================================================================== --- kdebase/workspace/README.pam (revision 998614) +++ kdebase/workspace/README.pam (working copy) @@ -13,8 +13,8 @@ Known Solaris Issues: -------------------- -For compiling PAM support on Solaris, PAM_MESSAGE_NONCONST must -be defined. This should now be handled automatically by the +For compiling PAM support on Solaris, PAM_MESSAGE_CONST must NOT +be defined. This should now be handled automatically by the configure script. === The configure script defines PAM_MESSAGE_CONST, not PAM_MESSAGE_NONCONST. SVN commit 1031391 by ossi: fix kcheckpass on solaris PAM_MESSAGE_NONCONST was transformed into !PAM_MESSAGE_CONST quite a while ago. BUG: 184465 M +2 -2 README.pam M +4 -4 kcheckpass/checkpass_pam.c WebSVN link: http://websvn.kde.org/?view=rev&revision=1031391 Reopening, since while the integrated fix corrected kcheckpass binary, it didn't solve the screen locker issue in description. While trying to find the root cause, I believe it's a lot like the following: http://lists.xcf.berkeley.edu/lists/gimp-developer/2000-November/013572.html I managed to work around the problem on OpenSolaris with the following patch, however this might break the behaviour on Linux. It would be good to come up with something portable. --- krunner/lock/lockdlg.cc.orig 2010-01-24 04:40:03.680732515 +0100 +++ krunner/lock/lockdlg.cc 2010-01-24 04:44:09.398214340 +0100 @@ -319,7 +319,26 @@ sNot->deleteLater(); ::close( sFd ); int status; - ::waitpid( sPid, &status, 0 ); + + /* On Solaris, the following ::waitpid is immediately interrupted, + * making it fail with EINTR. No status is obtained, even if kcheckpass + * returns 0 (AuthOk). As a result, user won't be able to unlock the screen. + * + * Let's grab the signal by sleep(), before we find a nicer solution. + */ + sleep(10); + + pid_t wpid; + wpid = ::waitpid( sPid, &status, 0 ); + if (wpid < 0) { + if (errno == EINTR) { + /* Modified version of cantCheck(). */ + greet->failed(); + static_cast< LockProcess* >(parent())->msgBox( this, QMessageBox::Critical, + "Failed to obtain status from kcheckpass child process.\n"); + abort(); + } + } else if (WIFEXITED(status)) switch (WEXITSTATUS(status)) { case AuthOk: your patch is somewhat baroque ... :) try this instead: diff --git a/krunner/lock/lockdlg.cc b/krunner/lock/lockdlg.cc index c69371a..f9323ca 100644 --- a/krunner/lock/lockdlg.cc +++ b/krunner/lock/lockdlg.cc @@ -320,5 +320,7 @@ void PasswordDlg::reapVerify() ::close( sFd ); int status; - ::waitpid( sPid, &status, 0 ); + while (::waitpid( sPid, &status, 0 ) < 0) + if (errno != EINTR) // This should not happen ... + goto authBad; if (WIFEXITED(status)) switch (WEXITSTATUS(status)) { @@ -328,4 +330,5 @@ void PasswordDlg::reapVerify() return; case AuthBad: + authBad: greet->failed(); mUnlockingFailed = true; anyway, it's well within the possibilities that you just debugged bug 217882. :D (In reply to comment #5) > your patch is somewhat baroque ... :) As long as it serves its purpose ... > diff --git a/krunner/lock/lockdlg.cc b/krunner/lock/lockdlg.cc > index c69371a..f9323ca 100644 > --- a/krunner/lock/lockdlg.cc > +++ b/krunner/lock/lockdlg.cc > @@ -320,5 +320,7 @@ void PasswordDlg::reapVerify() > ::close( sFd ); > int status; > - ::waitpid( sPid, &status, 0 ); > + while (::waitpid( sPid, &status, 0 ) < 0) > + if (errno != EINTR) // This should not happen ... > + goto authBad; > if (WIFEXITED(status)) > switch (WEXITSTATUS(status)) { > @@ -328,4 +330,5 @@ void PasswordDlg::reapVerify() > return; > case AuthBad: > + authBad: > greet->failed(); > mUnlockingFailed = true; > Thanks, this works in my test environment just fine. Are you about to commit it? > anyway, it's well within the possibilities that you just debugged bug 217882. > :D Cool :) SVN commit 1082437 by ossi: waitpid() may get INTerRupted BUG: 184465 CCBUG: 217882 M +5 -1 lockdlg.cc WebSVN link: http://websvn.kde.org/?view=rev&revision=1082437 |