Ian Kent 94e875
autofs-5.0.5 - add sasl mutex callbacks
Ian Kent 94e875
Ian Kent 94e875
From: Ian Kent <raven@themaw.net>
Ian Kent 94e875
Ian Kent 94e875
We missed the fact that Cyrus SASL requires the user to provide mutex
Ian Kent 94e875
handling functions when being used in a threaded environment.
Ian Kent 94e875
Ian Kent 94e875
Original patch contributed by Kazuhiro Kikuchi (of Fujitsu), slightly
Ian Kent 94e875
modified by myself.
Ian Kent 94e875
---
Ian Kent 94e875
Ian Kent 94e875
 CHANGELOG            |    1 
Ian Kent 94e875
 modules/cyrus-sasl.c |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++
Ian Kent 94e875
 2 files changed, 58 insertions(+)
Ian Kent 94e875
Ian Kent 94e875
Ian Kent 94e875
--- autofs-5.0.5.orig/CHANGELOG
Ian Kent 94e875
+++ autofs-5.0.5/CHANGELOG
Ian Kent 94e875
@@ -22,6 +22,7 @@
Ian Kent 94e875
 - fix disable timeout.
Ian Kent 94e875
 - fix strdup() return value check (Leonardo Chiquitto).
Ian Kent 94e875
 - fix reconnect get base dn.
Ian Kent 94e875
+- add missing sasl mutex callbacks.
Ian Kent 94e875
 
Ian Kent 94e875
 03/09/2009 autofs-5.0.5
Ian Kent 94e875
 -----------------------
Ian Kent 94e875
--- autofs-5.0.5.orig/modules/cyrus-sasl.c
Ian Kent 94e875
+++ autofs-5.0.5/modules/cyrus-sasl.c
Ian Kent 94e875
@@ -944,12 +944,69 @@ void autofs_sasl_dispose(struct lookup_c
Ian Kent 94e875
 	}
Ian Kent 94e875
 }
Ian Kent 94e875
 
Ian Kent 94e875
+static void *sasl_mutex_new(void)
Ian Kent 94e875
+{
Ian Kent 94e875
+	pthread_mutex_t* mutex;
Ian Kent 94e875
+
Ian Kent 94e875
+	mutex = malloc(sizeof(pthread_mutex_t));
Ian Kent 94e875
+	if (!mutex)
Ian Kent 94e875
+		return 0;
Ian Kent 94e875
+		
Ian Kent 94e875
+	pthread_mutex_init(mutex, NULL);
Ian Kent 94e875
+
Ian Kent 94e875
+	return (void *) mutex;
Ian Kent 94e875
+}
Ian Kent 94e875
+
Ian Kent 94e875
+static int sasl_mutex_lock(void *mutex __attribute__((unused)))
Ian Kent 94e875
+{
Ian Kent 94e875
+	int rc;
Ian Kent 94e875
+
Ian Kent 94e875
+	if (!mutex)
Ian Kent 94e875
+		return SASL_FAIL;
Ian Kent 94e875
+
Ian Kent 94e875
+	rc = pthread_mutex_lock((pthread_mutex_t *) mutex);
Ian Kent 94e875
+
Ian Kent 94e875
+	return (rc==0 ? SASL_OK : SASL_FAIL);
Ian Kent 94e875
+}
Ian Kent 94e875
+
Ian Kent 94e875
+static int sasl_mutex_unlock(void *mutex __attribute__((unused)))
Ian Kent 94e875
+{
Ian Kent 94e875
+	int rc;
Ian Kent 94e875
+
Ian Kent 94e875
+	if (!mutex)
Ian Kent 94e875
+		return SASL_FAIL;
Ian Kent 94e875
+
Ian Kent 94e875
+	rc = pthread_mutex_unlock((pthread_mutex_t *) mutex);
Ian Kent 94e875
+
Ian Kent 94e875
+	return (rc==0 ? SASL_OK : SASL_FAIL);
Ian Kent 94e875
+}
Ian Kent 94e875
+
Ian Kent 94e875
+static void sasl_mutex_dispose(void *mutex __attribute__((unused)))
Ian Kent 94e875
+{
Ian Kent 94e875
+	int rc;
Ian Kent 94e875
+
Ian Kent 94e875
+	if (!mutex)
Ian Kent 94e875
+		return;
Ian Kent 94e875
+
Ian Kent 94e875
+	rc = pthread_mutex_destroy((pthread_mutex_t *) mutex);
Ian Kent 94e875
+	if (rc == 0)
Ian Kent 94e875
+		free(mutex);
Ian Kent 94e875
+
Ian Kent 94e875
+	return;
Ian Kent 94e875
+}
Ian Kent 94e875
+
Ian Kent 94e875
 /*
Ian Kent 94e875
  * Initialize the sasl callbacks, which increments the global
Ian Kent 94e875
  * use counter.
Ian Kent 94e875
  */
Ian Kent 94e875
 int autofs_sasl_client_init(unsigned logopt)
Ian Kent 94e875
 {
Ian Kent 94e875
+
Ian Kent 94e875
+	sasl_set_mutex(sasl_mutex_new,
Ian Kent 94e875
+		       sasl_mutex_lock,
Ian Kent 94e875
+		       sasl_mutex_unlock,
Ian Kent 94e875
+		       sasl_mutex_dispose);
Ian Kent 94e875
+
Ian Kent 94e875
 	/* Start up Cyrus SASL--only needs to be done at library load. */
Ian Kent 94e875
 	if (sasl_client_init(callbacks) != SASL_OK) {
Ian Kent 94e875
 		error(logopt, "sasl_client_init failed");