--- autofs-4.1.3/modules/lookup_ldap.c	2005-11-04 14:47:30.000000000 -0800
+++ autofs-4.1.3/modules/lookup_ldap.c	2005-11-04 14:35:48.000000000 -0800
@@ -36,6 +36,8 @@ struct lookup_context {
 
 int lookup_version = AUTOFS_LOOKUP_VERSION;	/* Required by protocol */
 
+static int ldap_map_cache_timeout = -1;
+
 /*
  * This initializes a context (persistent non-global data) for queries to
  * this module.  Return zero if we succeed.
@@ -156,19 +158,19 @@ static int read_one_map(const char *root
 			int *result_ldap)
 {
 	struct lookup_context *ctxt = (struct lookup_context *) context;
-	int rv, i, l, count;
+	int rv, i, l, count, status = 0;
 	time_t age = time(NULL);
 	char *query;
-	LDAPMessage *result, *e;
+	LDAPMessage *result = NULL, *e;
 	char **keyValue = NULL;
 	char **values = NULL;
 	char *attrs[] = { key, type, NULL };
-	LDAP *ldap;
+	LDAP *ldap = NULL;
 	int version = 3;
 
 	if (ctxt == NULL) {
 		crit(MODPREFIX "context was NULL");
-		return 0;
+		return status;
 	}
 
 	/* Build a query string. */
@@ -179,8 +181,8 @@ static int read_one_map(const char *root
 
 	query = alloca(l);
 	if (query == NULL) {
-		crit(MODPREFIX "malloc: %m");
-		return 0;
+		crit(MODPREFIX "alloca: %m");
+		goto out;
 	}
 
 	memset(query, '\0', l);
@@ -200,7 +202,7 @@ static int read_one_map(const char *root
 	if ((ldap = ldap_init(ctxt->server, ctxt->port)) == NULL) {
 		crit(MODPREFIX "couldn't initialize LDAP connection"
 		     " to %s", ctxt->server ? ctxt->server : "default server");
-		return 0;
+		goto out;
 	}
 
 	/* Use LDAPv3 */
@@ -209,7 +211,8 @@ static int read_one_map(const char *root
 		ldap_unbind(ldap);
 		if ((ldap = ldap_init(ctxt->server, ctxt->port)) == NULL) {
 			crit(MODPREFIX "couldn't initialize LDAP");
-			return 1;
+			status = 0;
+			goto out;
 		} else {
 			version = 2;
 		}
@@ -225,7 +228,7 @@ static int read_one_map(const char *root
 		crit(MODPREFIX "couldn't bind to %s",
 		     ctxt->server ? ctxt->server : "default server");
 		*result_ldap = rv;
-		return 0;
+		goto out;
 	}
 
 	/* Look around. */
@@ -237,13 +240,13 @@ static int read_one_map(const char *root
 	if ((rv != LDAP_SUCCESS) || (result == NULL)) {
 		crit(MODPREFIX "query failed for %s: %s", query, ldap_err2string(rv));
 		*result_ldap = rv;
-		return 0;
+		goto out;
 	}
 
 	e = ldap_first_entry(ldap, result);
 	if (e == NULL) {
 		debug(MODPREFIX "query succeeded, no matches for %s", query);
-		return 0;
+		goto out;
 	} else
 		debug(MODPREFIX "examining first entry");
 
@@ -275,11 +278,14 @@ static int read_one_map(const char *root
 		e = ldap_next_entry(ldap, e);
 	}
 
+	status = 1;
+
+out:
 	/* Clean up. */
 	ldap_msgfree(result);
-	ldap_unbind(ldap);
+	if (ldap) ldap_unbind(ldap);
 
-	return 1;
+	return status;
 }
 
 static int read_map(const char *root, struct lookup_context *context,
@@ -365,6 +371,15 @@ static int lookup(const char *root, cons
 	char *mapname;
 	int status = -1;
 
+	/* Clean up the ldap cache if it's too old */
+	if (ldap_map_cache_timeout < 0) {
+		if (getenv("AUTOFS_LDAP_CACHE_TIMEOUT"))
+			ldap_map_cache_timeout = atoi(getenv("AUTOFS_LDAP_CACHE_TIMEOUT"));
+		else
+			ldap_map_cache_timeout = 900;
+	}
+	cache_clean(root,time(NULL)-ldap_map_cache_timeout);
+
 	me = cache_lookup(name);
 	if (me == NULL) {
 		if (sprintf(key, "%s/%s", root, name))
