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