Ian Kent 66b5fc
autofs-5.0.7 - fix null map entry order handling
Ian Kent 66b5fc
Ian Kent 66b5fc
From: Ian Kent <ikent@redhat.com>
Ian Kent 66b5fc
Ian Kent 66b5fc
If a null map entry appears after a corresponding indirect map entry
Ian Kent 66b5fc
autofs doesn't handle it properly.
Ian Kent 66b5fc
Ian Kent 66b5fc
Since it appears after the map entry it should'nt affect it but autofs
Ian Kent 66b5fc
doesn't account for this case and assumes the map entry is already
Ian Kent 66b5fc
mounted and tries to shut it down causing attempted access to facilities
Ian Kent 66b5fc
that don't exist.
Ian Kent 66b5fc
---
Ian Kent 66b5fc
Ian Kent 66b5fc
 CHANGELOG    |    1 +
Ian Kent 66b5fc
 lib/master.c |   32 +++++++++++++++++++++++++++++---
Ian Kent 66b5fc
 2 files changed, 30 insertions(+), 3 deletions(-)
Ian Kent 66b5fc
Ian Kent 66b5fc
Ian Kent 66b5fc
diff --git a/CHANGELOG b/CHANGELOG
Ian Kent 66b5fc
index 7b8d185..79cf673 100644
Ian Kent 66b5fc
--- a/CHANGELOG
Ian Kent 66b5fc
+++ b/CHANGELOG
Ian Kent 66b5fc
@@ -7,6 +7,7 @@
Ian Kent 66b5fc
 - fix typo in automount(8).
Ian Kent 66b5fc
 - dont wait forever to restart.
Ian Kent 66b5fc
 - add timeout option description to man page.
Ian Kent 66b5fc
+- fix null map entry order handling.
Ian Kent 66b5fc
 
Ian Kent 66b5fc
 25/07/2012 autofs-5.0.7
Ian Kent 66b5fc
 =======================
Ian Kent 66b5fc
diff --git a/lib/master.c b/lib/master.c
Ian Kent 66b5fc
index 904b13d..a0e62f2 100644
Ian Kent 66b5fc
--- a/lib/master.c
Ian Kent 66b5fc
+++ b/lib/master.c
Ian Kent 66b5fc
@@ -1179,9 +1179,35 @@ int master_mount_mounts(struct master *master, time_t age, int readall)
Ian Kent 66b5fc
 
Ian Kent 66b5fc
 		cache_readlock(nc);
Ian Kent 66b5fc
 		ne = cache_lookup_distinct(nc, this->path);
Ian Kent 66b5fc
-		if (ne && this->age > ne->age) {
Ian Kent 66b5fc
+		/*
Ian Kent 66b5fc
+		 * If this path matched a nulled entry the master map entry
Ian Kent 66b5fc
+		 * must be an indirect mount so the master map entry line
Ian Kent 66b5fc
+		 * number may be obtained from this->maps.
Ian Kent 66b5fc
+		 */
Ian Kent 66b5fc
+		if (ne) {
Ian Kent 66b5fc
+			int lineno = ne->age;
Ian Kent 66b5fc
 			cache_unlock(nc);
Ian Kent 66b5fc
-			st_add_task(ap, ST_SHUTDOWN_PENDING);
Ian Kent 66b5fc
+
Ian Kent 66b5fc
+			/* null entry appears after map entry */
Ian Kent 66b5fc
+			if (this->maps->master_line < lineno) {
Ian Kent 66b5fc
+				warn(ap->logopt,
Ian Kent 66b5fc
+				     "ignoring null entry that appears after "
Ian Kent 66b5fc
+				     "existing entry for %s", this->path);
Ian Kent 66b5fc
+				goto cont;
Ian Kent 66b5fc
+			}
Ian Kent 66b5fc
+			if (ap->state != ST_INIT) {
Ian Kent 66b5fc
+				st_add_task(ap, ST_SHUTDOWN_PENDING);
Ian Kent 66b5fc
+				continue;
Ian Kent 66b5fc
+			}
Ian Kent 66b5fc
+			/*
Ian Kent 66b5fc
+			 * The map entry hasn't been started yet and we've
Ian Kent 66b5fc
+			 * seen a preceeding null map entry for it so just
Ian Kent 66b5fc
+			 * delete it from the master map entry list so it
Ian Kent 66b5fc
+			 * doesn't get in the road.
Ian Kent 66b5fc
+			 */
Ian Kent 66b5fc
+			list_del_init(&this->list);
Ian Kent 66b5fc
+			master_free_mapent_sources(ap->entry, 1);
Ian Kent 66b5fc
+			master_free_mapent(ap->entry);
Ian Kent 66b5fc
 			continue;
Ian Kent 66b5fc
 		}
Ian Kent 66b5fc
 		nested = cache_partial_match(nc, this->path);
Ian Kent 66b5fc
@@ -1194,7 +1220,7 @@ int master_mount_mounts(struct master *master, time_t age, int readall)
Ian Kent 66b5fc
 				cache_delete(nc, nested->key);
Ian Kent 66b5fc
 		}
Ian Kent 66b5fc
 		cache_unlock(nc);
Ian Kent 66b5fc
-
Ian Kent 66b5fc
+cont:
Ian Kent 66b5fc
 		st_mutex_lock();
Ian Kent 66b5fc
 
Ian Kent 66b5fc
 		state_pipe = this->ap->state_pipe[1];