]> andersk Git - openssh.git/commitdiff
- (dtucker) [openbsd-compat/port-aix.c openbsd-compat/port-aix.h] Restore
authordtucker <dtucker>
Fri, 6 Feb 2004 05:17:51 +0000 (05:17 +0000)
committerdtucker <dtucker>
Fri, 6 Feb 2004 05:17:51 +0000 (05:17 +0000)
   previous authdb setting after auth calls.  Fixes problems with setpcred
   failing on accounts that use AFS or NIS password registries.

ChangeLog
openbsd-compat/port-aix.c
openbsd-compat/port-aix.h

index 9772049430e74e615f14d77d3b4fa10298c81fe4..d7474b266d0fa952ed6c0e8f88c5dbe054779252 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,9 @@
    required, please report them.  ok djm@
  - (dtucker) [sshd.c] Bug #757: Clear child's environment to prevent
    accidentally inheriting from root's environment.  ok djm@
+ - (dtucker) [openbsd-compat/port-aix.c openbsd-compat/port-aix.h] Restore
+   previous authdb setting after auth calls.  Fixes problems with setpcred
+   failing on accounts that use AFS or NIS password registries.
 
 20040129
  - (dtucker) OpenBSD CVS Sync regress/
index a9cbf49b0bb3618428055822c28987e61f3443cc..6fc2ef771edba1fa8e18241e62a94f551374f02d 100644 (file)
 extern ServerOptions options;
 extern Buffer loginmsg;
 
+# ifdef HAVE_SETAUTHDB
+static char old_registry[REGISTRY_SIZE] = "";
+# endif
+
 /*
  * AIX has a "usrinfo" area where logname and other stuff is stored - 
  * a few applications actually use this and die if it's not set
@@ -119,6 +123,7 @@ aix_authenticate(const char *name, const char *password, const char *host)
                                xfree(msg);
                        }
                }
+               aix_restoreauthdb();
        }
 
        if (authmsg != NULL)
@@ -145,22 +150,21 @@ record_failed_login(const char *user, const char *ttyname)
 #   else
        loginfailed((char *)user, hostname, (char *)ttyname);
 #   endif
+       aix_restoreauthdb();
 }
 #  endif /* CUSTOM_FAILED_LOGIN */
 
 /*
  * If we have setauthdb, retrieve the password registry for the user's
- * account then feed it to setauthdb.  This may load registry-specific method
- * code.  If we don't have setauthdb or have already called it this is a no-op.
+ * account then feed it to setauthdb.  This will mean that subsequent AIX auth
+ * functions will only use the specified loadable module.  If we don't have
+ * setauthdb this is a no-op.
  */
 void
 aix_setauthdb(const char *user)
 {
 #  ifdef HAVE_SETAUTHDB
-       static char *registry = NULL;
-
-       if (registry != NULL)   /* have already done setauthdb */
-               return;
+       char *registry;
 
        if (setuserdb(S_READ) == -1) {
                debug3("%s: Could not open userdb to read", __func__);
@@ -168,12 +172,11 @@ aix_setauthdb(const char *user)
        }
        
        if (getuserattr((char *)user, S_REGISTRY, &registry, SEC_CHAR) == 0) {
-               if (setauthdb(registry, NULL) == 0)
-                       debug3("%s: AIX/setauthdb set registry %s", __func__,
-                           registry);
+               if (setauthdb(registry, old_registry) == 0)
+                       debug3("AIX/setauthdb set registry '%s'", registry);
                else 
-                       debug3("%s: AIX/setauthdb set registry %s failed: %s",
-                           __func__, registry, strerror(errno));
+                       debug3("AIX/setauthdb set registry '%s' failed: %s",
+                           registry, strerror(errno));
        } else
                debug3("%s: Could not read S_REGISTRY for user: %s", __func__,
                    strerror(errno));
@@ -181,6 +184,25 @@ aix_setauthdb(const char *user)
 #  endif /* HAVE_SETAUTHDB */
 }
 
+/*
+ * Restore the user's registry settings from old_registry.
+ * Note that if the first aix_setauthdb fails, setauthdb("") is still safe
+ * (it restores the system default behaviour).  If we don't have setauthdb,
+ * this is a no-op.
+ */
+void
+aix_restoreauthdb(void)
+{
+#  ifdef HAVE_SETAUTHDB
+       if (setauthdb(old_registry, NULL) == 0)
+               debug3("%s: restoring old registry '%s'", __func__,
+                   old_registry);
+       else
+               debug3("%s: failed to restore old registry %s", __func__,
+                   old_registry);
+#  endif /* HAVE_SETAUTHDB */
+}
+
 # endif /* WITH_AIXAUTHENTICATE */
 
 #endif /* _AIX */
index 8c8e1fbffa2fc6c2d9787feb073a0ff63fb80190..7c7fb90ba27bd30a8d230170c872f7d68589e9af 100644 (file)
 # include <sys/timers.h>
 #endif
 
+/*
+ * According to the setauthdb man page, AIX password registries must be 15
+ * chars or less plus terminating NUL.
+ */
+#ifdef HAVE_SETAUTHDB
+# define REGISTRY_SIZE 16
+#endif
+
 void aix_usrinfo(struct passwd *);
 
 #ifdef WITH_AIXAUTHENTICATE
@@ -60,5 +68,6 @@ void record_failed_login(const char *, const char *);
 
 int aix_authenticate(const char *, const char *, const char *);
 void aix_setauthdb(const char *);
+void aix_restoreauthdb(void);
 void aix_remove_embedded_newlines(char *);
 #endif /* _AIX */
This page took 0.103925 seconds and 5 git commands to generate.