Blob Blame History Raw
autofs-5.1.0 - handle duplicates in multi mounts

From: Ian Kent <ikent@redhat.com>

Duplicate entries in multi-mounts are a syntax error however some
other automount implementations allow them and attempt to continue
with the mount anyway.

This patch turns a detected duplicate error into a success return
in order to continue.

Since it can't be known if the first or the later entry is the
correct one to use the later replaces the old unless a memory
allocation error occures in which case the old entry is retained
and the change is noted in the log.
---
 CHANGELOG           |    1 +
 lib/cache.c         |   19 ++++++++++++++++++-
 modules/parse_sun.c |    5 +++--
 3 files changed, 22 insertions(+), 3 deletions(-)

--- autofs-5.0.7.orig/CHANGELOG
+++ autofs-5.0.7/CHANGELOG
@@ -165,6 +165,7 @@
 - add a prefix to program map stdvars.
 - add config option to force use of program map stdvars.
 - fix incorrect check in parse_mount().
+- handle duplicates in multi mounts.
 
 25/07/2012 autofs-5.0.7
 =======================
--- autofs-5.0.7.orig/lib/cache.c
+++ autofs-5.0.7/lib/cache.c
@@ -733,8 +733,25 @@ int cache_update_offset(struct mapent_ca
 
 	me = cache_lookup_distinct(mc, key);
 	if (me && me->age == age) {
-		if (me == owner || strcmp(me->key, key) == 0)
+		if (me == owner || strcmp(me->key, key) == 0) {
+			char *pent;
+
+			warn(logopt,
+			     "duplcate offset detected for key %s", me->key);
+
+			pent = malloc(strlen(mapent) + 1);
+			if (!pent)
+				warn(logopt,
+				     "map entry not updated: %s", me->mapent);
+			else {
+				if (me->mapent)
+					free(me->mapent);
+				me->mapent = strcpy(pent, mapent);
+				warn(logopt,
+				     "map entry updated with: %s", mapent);
+			}
 			return CHE_DUPLICATE;
+		}
 	}
 
 	ret = cache_update(mc, owner->source, key, mapent, age);
--- autofs-5.0.7.orig/modules/parse_sun.c
+++ autofs-5.0.7/modules/parse_sun.c
@@ -804,10 +804,11 @@ update_offset_entry(struct autofs_point
 	}
 
 	ret = cache_update_offset(mc, name, m_key, m_mapent, age);
-	if (ret == CHE_DUPLICATE)
+	if (ret == CHE_DUPLICATE) {
 		warn(ap->logopt, MODPREFIX
 		     "syntax error or duplicate offset %s -> %s", path, loc);
-	else if (ret == CHE_FAIL)
+		ret = CHE_OK;
+	} else if (ret == CHE_FAIL)
 		debug(ap->logopt, MODPREFIX
 		      "failed to update multi-mount offset %s -> %s", path, m_mapent);
 	else {