Ian Kent 1d72a0
diff -up autofs-5.0.3/include/lookup_ldap.h.init-cb-on-load autofs-5.0.3/include/lookup_ldap.h
Ian Kent 1d72a0
--- autofs-5.0.3/include/lookup_ldap.h.init-cb-on-load	2008-01-14 13:39:16.000000000 +0900
Ian Kent 1d72a0
+++ autofs-5.0.3/include/lookup_ldap.h	2008-03-24 14:10:09.000000000 +0900
Ian Kent beeac8
@@ -99,10 +99,12 @@ int unbind_ldap_connection(unsigned logo
Ian Kent beeac8
 int authtype_requires_creds(const char *authtype);
Ian Kent beeac8
 
Ian Kent beeac8
 /* cyrus-sasl.c */
Ian Kent beeac8
+int autofs_sasl_client_init(unsigned logopt);
Ian Kent beeac8
 int autofs_sasl_init(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt);
Ian Kent beeac8
 int autofs_sasl_bind(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt);
Ian Kent beeac8
 void autofs_sasl_unbind(struct lookup_context *ctxt);
Ian Kent beeac8
-void autofs_sasl_done(struct lookup_context *ctxt);
Ian Kent beeac8
+void autofs_sasl_dispose(struct lookup_context *ctxt);
Ian Kent beeac8
+void autofs_sasl_done(void);
Ian Kent beeac8
 #endif
Ian Kent beeac8
 
Ian Kent beeac8
 #endif
Ian Kent 1d72a0
diff -up autofs-5.0.3/modules/lookup_ldap.c.init-cb-on-load autofs-5.0.3/modules/lookup_ldap.c
Ian Kent 1d72a0
--- autofs-5.0.3/modules/lookup_ldap.c.init-cb-on-load	2008-03-24 14:09:18.000000000 +0900
Ian Kent 1d72a0
+++ autofs-5.0.3/modules/lookup_ldap.c	2008-03-24 14:10:09.000000000 +0900
Ian Kent beeac8
@@ -599,7 +599,7 @@ static LDAP *connect_to_server(unsigned 
Ian Kent beeac8
 
Ian Kent beeac8
 		if (!do_bind(logopt, ldap, ctxt)) {
Ian Kent beeac8
 			unbind_ldap_connection(logopt, ldap, ctxt);
Ian Kent beeac8
-			autofs_sasl_done(ctxt);
Ian Kent beeac8
+			autofs_sasl_dispose(ctxt);
Ian Kent beeac8
 			error(logopt, MODPREFIX "cannot bind to server");
Ian Kent beeac8
 			return NULL;
Ian Kent beeac8
 		}
Ian Kent beeac8
@@ -672,7 +672,7 @@ static LDAP *do_reconnect(unsigned logop
Ian Kent beeac8
 	list_add_tail(&this->list, ctxt->uri);
Ian Kent beeac8
 
Ian Kent beeac8
 #ifdef WITH_SASL
Ian Kent beeac8
-	autofs_sasl_done(ctxt);
Ian Kent beeac8
+	autofs_sasl_dispose(ctxt);
Ian Kent beeac8
 #endif
Ian Kent beeac8
 
Ian Kent beeac8
 	/* Current server failed connect, try the rest */
Ian Kent beeac8
@@ -1330,6 +1330,13 @@ int lookup_init(const char *mapfmt, int 
Ian Kent beeac8
 		free_context(ctxt);
Ian Kent beeac8
 		return 1;
Ian Kent beeac8
 	}
Ian Kent beeac8
+
Ian Kent beeac8
+	/* Init the sasl callbacks */
Ian Kent beeac8
+	if (!autofs_sasl_client_init(LOGOPT_NONE)) {
Ian Kent beeac8
+		error(LOGOPT_ANY, "failed to init sasl client");
Ian Kent beeac8
+		free_context(ctxt);
Ian Kent beeac8
+		return 1;
Ian Kent beeac8
+	}
Ian Kent beeac8
 #endif
Ian Kent beeac8
 
Ian Kent beeac8
 	if (ctxt->server || !ctxt->uri) {
Ian Kent beeac8
@@ -2640,7 +2647,8 @@ int lookup_done(void *context)
Ian Kent beeac8
 	struct lookup_context *ctxt = (struct lookup_context *) context;
Ian Kent beeac8
 	int rv = close_parse(ctxt->parse);
Ian Kent beeac8
 #ifdef WITH_SASL
Ian Kent beeac8
-	autofs_sasl_done(ctxt);
Ian Kent beeac8
+	autofs_sasl_dispose(ctxt);
Ian Kent beeac8
+	autofs_sasl_done();
Ian Kent beeac8
 #endif
Ian Kent beeac8
 	free_context(ctxt);
Ian Kent beeac8
 	return rv;
Ian Kent 1d72a0
diff -up autofs-5.0.3/modules/cyrus-sasl.c.init-cb-on-load autofs-5.0.3/modules/cyrus-sasl.c
Ian Kent 1d72a0
--- autofs-5.0.3/modules/cyrus-sasl.c.init-cb-on-load	2008-01-14 13:39:16.000000000 +0900
Ian Kent 1d72a0
+++ autofs-5.0.3/modules/cyrus-sasl.c	2008-03-24 14:10:09.000000000 +0900
Ian Kent beeac8
@@ -76,7 +76,6 @@ static const char *default_client = "aut
Ian Kent beeac8
 static pthread_mutex_t krb5cc_mutex = PTHREAD_MUTEX_INITIALIZER;
Ian Kent beeac8
 static unsigned int krb5cc_in_use = 0;
Ian Kent beeac8
 
Ian Kent beeac8
-static unsigned int init_callbacks = 1;
Ian Kent beeac8
 static int sasl_log_func(void *, int, const char *);
Ian Kent beeac8
 static int getpass_func(sasl_conn_t *, void *, int, sasl_secret_t **);
Ian Kent beeac8
 static int getuser_func(void *, int, const char **, unsigned *);
Ian Kent beeac8
@@ -878,13 +877,6 @@ autofs_sasl_init(unsigned logopt, LDAP *
Ian Kent beeac8
 {
Ian Kent beeac8
 	sasl_conn_t *conn;
Ian Kent beeac8
 
Ian Kent beeac8
-	/* Start up Cyrus SASL--only needs to be done once. */
Ian Kent beeac8
-	if (init_callbacks && sasl_client_init(callbacks) != SASL_OK) {
Ian Kent beeac8
-		error(logopt, "sasl_client_init failed");
Ian Kent beeac8
-		return -1;
Ian Kent beeac8
-	}
Ian Kent beeac8
-	init_callbacks = 0;
Ian Kent beeac8
-
Ian Kent beeac8
 	sasl_auth_id = ctxt->user;
Ian Kent beeac8
 	sasl_auth_secret = ctxt->secret;
Ian Kent beeac8
 
Ian Kent beeac8
@@ -916,8 +908,7 @@ autofs_sasl_init(unsigned logopt, LDAP *
Ian Kent beeac8
  *  Destructor routine.  This should be called when finished with an ldap
Ian Kent beeac8
  *  session.
Ian Kent beeac8
  */
Ian Kent beeac8
-void
Ian Kent beeac8
-autofs_sasl_done(struct lookup_context *ctxt)
Ian Kent beeac8
+void autofs_sasl_dispose(struct lookup_context *ctxt)
Ian Kent beeac8
 {
Ian Kent beeac8
 	int status, ret;
Ian Kent beeac8
 
Ian Kent beeac8
@@ -953,3 +944,28 @@ autofs_sasl_done(struct lookup_context *
Ian Kent beeac8
 		ctxt->kinit_successful = 0;
Ian Kent beeac8
 	}
Ian Kent beeac8
 }
Ian Kent beeac8
+
Ian Kent beeac8
+/*
Ian Kent beeac8
+ * Initialize the sasl callbacks, which increments the global
Ian Kent beeac8
+ * use counter.
Ian Kent beeac8
+ */
Ian Kent beeac8
+int autofs_sasl_client_init(unsigned logopt)
Ian Kent beeac8
+{
Ian Kent beeac8
+	/* Start up Cyrus SASL--only needs to be done at library load. */
Ian Kent beeac8
+	if (sasl_client_init(callbacks) != SASL_OK) {
Ian Kent beeac8
+		error(logopt, "sasl_client_init failed");
Ian Kent beeac8
+		return 0;
Ian Kent beeac8
+	}
Ian Kent beeac8
+	return 1;
Ian Kent beeac8
+}
Ian Kent beeac8
+
Ian Kent beeac8
+/*
Ian Kent beeac8
+ * Decrement the library reference count and free resources if
Ian Kent beeac8
+ * we are the last to close the library.
Ian Kent beeac8
+ */
Ian Kent beeac8
+void autofs_sasl_done(void)
Ian Kent beeac8
+{
Ian Kent beeac8
+	sasl_done();
Ian Kent beeac8
+	return;
Ian Kent beeac8
+}
Ian Kent beeac8
+
Ian Kent 1d72a0
diff -up autofs-5.0.3/CHANGELOG.init-cb-on-load autofs-5.0.3/CHANGELOG
Ian Kent 1d72a0
--- autofs-5.0.3/CHANGELOG.init-cb-on-load	2008-03-24 14:09:18.000000000 +0900
Ian Kent 1d72a0
+++ autofs-5.0.3/CHANGELOG	2008-03-24 14:10:09.000000000 +0900
Ian Kent 1d72a0
@@ -9,6 +9,7 @@
Ian Kent 1d72a0
 - fix expire working harder than needed.
Ian Kent 1d72a0
 - fix unlink of mount tree incorrectly causing autofs mount fail.
Ian Kent 1d72a0
 - add missing check for zero length NIS key (Wengang Wang).
Ian Kent 1d72a0
+- init SASL callbacks on every ldap lookup library load.
Ian Kent 1d72a0
  
Ian Kent 1d72a0
 14/01/2008 autofs-5.0.3
Ian Kent 1d72a0
 -----------------------