X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fpasswd-pam.c;h=2452bbc63b91322a35675c51ee214eb4edf756db;hb=ccb7f4903325f92555a9722bba74b58346654ba0;hp=7560d1a41ec487175784a56687f81db48495a77b;hpb=96bdd7cf6ea60c418a76921acaf0e34d6f5be930;p=xscreensaver diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c index 7560d1a4..2452bbc6 100644 --- a/driver/passwd-pam.c +++ b/driver/passwd-pam.c @@ -246,6 +246,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p) PAM_NO_DELAY(pamh); + timeout.tv_sec = 0; timeout.tv_nsec = 1; set = block_sigchld(); status = pam_authenticate (pamh, 0); @@ -257,6 +258,18 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p) blurb(), status, PAM_STRERROR(pamh, status)); if (status == PAM_SUCCESS) /* Win! */ { + int status2; + + /* We don't actually care if the account modules fail or succeed, + * but we need to run them anyway because certain pam modules + * depend on side effects of the account modules getting run. + */ + status2 = pam_acct_mgmt (pamh, 0); + + if (verbose_p) + fprintf (stderr, "%s: pam_acct_mgmt (...) ==> %d (%s)\n", + blurb(), status2, PAM_STRERROR(pamh, status2)); + /* Each time we successfully authenticate, refresh credentials, for Kerberos/AFS/DCE/etc. If this fails, just ignore that failure and blunder along; it shouldn't matter. @@ -266,7 +279,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p) says that the Linux PAM library ignores that one, and only refreshes credentials when using PAM_REINITIALIZE_CRED. */ - int status2 = pam_setcred (pamh, PAM_REINITIALIZE_CRED); + status2 = pam_setcred (pamh, PAM_REINITIALIZE_CRED); if (verbose_p) fprintf (stderr, "%s: pam_setcred (...) ==> %d (%s)\n", blurb(), status2, PAM_STRERROR(pamh, status2)); @@ -326,7 +339,11 @@ pam_priv_init (int argc, char **argv, Bool verbose_p) const char file2[] = "/etc/pam.conf"; struct stat st; - if (stat (dir, &st) == 0 && st.st_mode & S_IFDIR) +# ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +# endif + + if (stat (dir, &st) == 0 && S_ISDIR(st.st_mode)) { if (stat (file, &st) != 0) fprintf (stderr,