aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--patches-applied/049_pam_unix_sane_locking237
1 files changed, 237 insertions, 0 deletions
diff --git a/patches-applied/049_pam_unix_sane_locking b/patches-applied/049_pam_unix_sane_locking
new file mode 100644
index 00000000..76d2a3bf
--- /dev/null
+++ b/patches-applied/049_pam_unix_sane_locking
@@ -0,0 +1,237 @@
+Delta from 1.12 to 1.13 from Linux-PAM pam_unix_passwd.c
+made to work with our changes.
+
+
+Index: Linux-PAM/modules/pam_unix/pam_unix_passwd.c
+===================================================================
+RCS file: /afs/sipb/project/debian/cvs/pam/Linux-PAM/modules/pam_unix/pam_unix_passwd.c,v
+retrieving revision 1.10
+diff -u -r1.10 pam_unix_passwd.c
+--- Linux-PAM/modules/pam_unix/pam_unix_passwd.c 12 Jan 2004 06:43:14 -0000 1.10
++++ Linux-PAM/modules/pam_unix/pam_unix_passwd.c 12 Jan 2004 06:44:03 -0000
+@@ -88,7 +88,7 @@
+ */
+
+ #ifdef NEED_LCKPWDF
+-#include "./lckpwdf.-c"
++# include "./lckpwdf.-c"
+ #endif
+
+ extern char *bigcrypt(const char *key, const char *salt);
+@@ -494,10 +494,7 @@
+
+ D(("called"));
+
+- setpwent();
+ pwd = getpwnam(forwho);
+- endpwent();
+-
+ if (pwd == NULL)
+ return PAM_AUTHTOK_ERR;
+
+@@ -569,6 +566,24 @@
+ if (save_old_password(forwho, fromwhat, remember)) {
+ return PAM_AUTHTOK_ERR;
+ }
++
++#ifdef USE_LCKPWDF
++ /*
++ * These values for the number of attempts and the sleep time
++ * are, of course, completely arbitrary.
++ *
++ * My reading of the PAM docs is that, once pam_chauthtok()
++ * has been called with PAM_UPDATE_AUTHTOK, we are obliged to
++ * take any reasonable steps to make sure the token is
++ * updated; so retrying for 1/10 sec. isn't overdoing it.
++ */
++
++ retval = lckpwdf();
++ if (retval != 0) {
++ return PAM_AUTHTOK_LOCK_BUSY;
++ }
++#endif /* def USE_LCKPWDF */
++
+ if (on(UNIX_SHADOW, ctrl) || (strcmp(pwd->pw_passwd, "x") == 0)) {
+ retval = _update_shadow(forwho, towhat);
+ if (retval == PAM_SUCCESS)
+@@ -580,6 +595,10 @@
+ if (retval == PAM_SUCCESS)
+ _log_err(LOG_NOTICE, pamh, "Password for %s was changed", forwho);
+
++#ifdef USE_LCKPWDF
++ ulckpwdf();
++#endif /* def USE_LCKPWDF */
++
+ return retval;
+ }
+
+@@ -708,7 +727,7 @@
+ int argc, const char **argv)
+ {
+ unsigned int ctrl, lctrl;
+- int retval, i;
++ int retval;
+ int remember = -1;
+
+ /* <DO NOT free() THESE> */
+@@ -718,33 +737,12 @@
+
+ D(("called."));
+
+-#ifdef USE_LCKPWDF
+- /* our current locking system requires that we lock the
+- entire password database. This avoids both livelock
+- and deadlock. */
+- /* These values for the number of attempts and the sleep time
+- are, of course, completely arbitrary.
+- My reading of the PAM docs is that, once pam_chauthtok() has been
+- called with PAM_UPDATE_AUTHTOK, we are obliged to take any
+- reasonable steps to make sure the token is updated; so retrying
+- for 1/10 sec. isn't overdoing it.
+- The other possibility is to call lckpwdf() on the first
+- pam_chauthtok() pass, and hold the lock until released in the
+- second pass--but is this guaranteed to work? -SRL */
+- i=0;
+- while((retval = lckpwdf()) != 0 && i < 100) {
+- usleep(1000);
+- }
+- if(retval != 0) {
+- return PAM_AUTHTOK_LOCK_BUSY;
+- }
+-#endif
+ ctrl = _set_ctrl(pamh, flags, &remember, argc, argv);
+
+ /*
+ * First get the name of a user
+ */
+- retval = pam_get_user(pamh, &user, "Username: ");
++ retval = pam_get_user(pamh, &user, NULL);
+ if (retval == PAM_SUCCESS) {
+ /*
+ * Various libraries at various times have had bugs related to
+@@ -754,9 +752,6 @@
+ */
+ if (user == NULL || !isalnum(*user)) {
+ _log_err(LOG_ERR, pamh, "bad username [%s]", user);
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return PAM_USER_UNKNOWN;
+ }
+ if (retval == PAM_SUCCESS && on(UNIX_DEBUG, ctrl))
+@@ -766,9 +761,6 @@
+ if (on(UNIX_DEBUG, ctrl))
+ _log_err(LOG_DEBUG, pamh,
+ "password - could not identify user");
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+
+@@ -790,9 +782,6 @@
+ D(("prelim check"));
+
+ if (_unix_blankpasswd(ctrl, user)) {
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return PAM_SUCCESS;
+ } else if (off(UNIX__IAMROOT, ctrl) || on(UNIX_NIS, ctrl)) {
+
+@@ -802,9 +791,6 @@
+ if (Announce == NULL) {
+ _log_err(LOG_CRIT, pamh,
+ "password - out of memory");
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return PAM_BUF_ERR;
+ }
+ (void) strcpy(Announce, greeting);
+@@ -826,9 +812,6 @@
+ if (retval != PAM_SUCCESS) {
+ _log_err(LOG_NOTICE, pamh
+ ,"password - (old) token not obtained");
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ /* verify that this is the password for this user
+@@ -846,9 +829,6 @@
+ if (retval != PAM_SUCCESS) {
+ D(("Authentication failed"));
+ pass_old = NULL;
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ retval = pam_set_item(pamh, PAM_OLDAUTHTOK, (const void *) pass_old);
+@@ -901,17 +881,11 @@
+
+ if (retval != PAM_SUCCESS) {
+ _log_err(LOG_NOTICE, pamh, "user not authenticated");
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ retval = _unix_verify_shadow(user, ctrl);
+ if (retval != PAM_SUCCESS) {
+ _log_err(LOG_NOTICE, pamh, "user not authenticated 2");
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ D(("get new password now"));
+@@ -942,9 +916,6 @@
+ ,"password - new password not obtained");
+ }
+ pass_old = NULL; /* tidy up */
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ D(("returned to _unix_chauthtok"));
+@@ -965,9 +936,6 @@
+ _log_err(LOG_NOTICE, pamh,
+ "new password not acceptable");
+ pass_new = pass_old = NULL; /* tidy up */
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+ /*
+@@ -1008,9 +976,6 @@
+ _log_err(LOG_CRIT, pamh,
+ "out of memory for password");
+ pass_new = pass_old = NULL; /* tidy up */
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return PAM_BUF_ERR;
+ }
+ /* copy first 8 bytes of password */
+@@ -1032,6 +997,7 @@
+
+ retval = _do_setpass(pamh, user, pass_old, tpass, ctrl,
+ remember);
++
+ _pam_delete(tpass);
+ pass_old = pass_new = NULL;
+ } else { /* something has broken with the module */
+@@ -1042,9 +1008,6 @@
+
+ D(("retval was %d", retval));
+
+-#ifdef USE_LCKPWDF
+- ulckpwdf();
+-#endif
+ return retval;
+ }
+