autofs-5.0.5 - fix out of order locking in readmap From: Ian Kent When re-reading the master map and a mount lookup for a particular map entry arrives at the same time a map source is being added to the map entry and a map entry re-read is also initiated at the same time an out of order mutex locking bug which results in a hang. --- CHANGELOG | 1 + lib/master.c | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f215a30..5ac1648 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -67,6 +67,7 @@ - fix stale map read. - fix null cache clean. - automount(8) man page correction. +- fix out of order locking in readmap. 03/09/2009 autofs-5.0.5 ----------------------- diff --git a/lib/master.c b/lib/master.c index 4b48883..5846f72 100644 --- a/lib/master.c +++ b/lib/master.c @@ -624,8 +624,6 @@ struct master_mapent *master_find_mapent(struct master *master, const char *path { struct list_head *head, *p; - master_mutex_lock(); - head = &master->mounts; list_for_each(p, head) { struct master_mapent *entry; @@ -638,8 +636,6 @@ struct master_mapent *master_find_mapent(struct master *master, const char *path } } - master_mutex_unlock(); - return NULL; } @@ -716,9 +712,7 @@ struct master_mapent *master_new_mapent(struct master *master, const char *path, void master_add_mapent(struct master *master, struct master_mapent *entry) { - master_mutex_lock(); list_add_tail(&entry->list, &master->mounts); - master_mutex_unlock(); return; } @@ -826,6 +820,7 @@ int master_read_master(struct master *master, time_t age, int readall) * We need to clear and re-populate the null map entry cache * before alowing anyone else to use it. */ + master_mutex_lock(); if (master->nc) { cache_writelock(master->nc); nc = master->nc; @@ -844,6 +839,7 @@ int master_read_master(struct master *master, time_t age, int readall) master_init_scan(); lookup_nss_read_master(master, age); cache_unlock(nc); + master_mutex_unlock(); if (!master->read_fail) master_mount_mounts(master, age, readall);