From ca38f0b091a3903f5b0c213ef3b0a416d743fad4 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Tue, 8 Nov 2011 13:13:22 +0800 Subject: [PATCH] * Tue Nov 8 2011 Ian Kent - 1:5.0.6-3 - improve mount location error reporting. - fix paged query more results check. - fix dumpmaps not reading maps. - fix result null check in read_one_map(). - Fix LDAP result leaks on error paths. - code analysis fixes 1. - fix not bind mounting local filesystem. - update dir map-type patch for changed patch order. - fix wait for master source mutex. - fix submount shutdown race - fix fix map source check in file lookup. - add disable move mount configure option. --- autofs-5.0.6-add-dir-map-type.patch | 15 +- ...-disable-move-mount-configure-option.patch | 334 ++++++++++++++++++ autofs-5.0.6-code-analysis-fixes-1.patch | 101 ++++++ ...fix-LDAP-result-leaks-on-error-paths.patch | 56 +++ ...-5.0.6-fix-dumpmaps-not-reading-maps.patch | 47 +++ ...-fix-map-source-check-in-file-lookup.patch | 40 +++ ...x-not-bind-mounting-local-filesystem.patch | 56 +++ ...6-fix-paged-query-more-results-check.patch | 87 +++++ ...ix-result-null-check-in-read_one_map.patch | 58 +++ autofs-5.0.6-fix-submount-shutdown-race.patch | 141 ++++++++ ...0.6-fix-wait-for-master-source-mutex.patch | 84 +++++ ...prove-mount-location-error-reporting.patch | 117 ++++++ autofs.spec | 42 ++- 13 files changed, 1174 insertions(+), 4 deletions(-) create mode 100644 autofs-5.0.6-add-disable-move-mount-configure-option.patch create mode 100644 autofs-5.0.6-code-analysis-fixes-1.patch create mode 100644 autofs-5.0.6-fix-LDAP-result-leaks-on-error-paths.patch create mode 100644 autofs-5.0.6-fix-dumpmaps-not-reading-maps.patch create mode 100644 autofs-5.0.6-fix-fix-map-source-check-in-file-lookup.patch create mode 100644 autofs-5.0.6-fix-not-bind-mounting-local-filesystem.patch create mode 100644 autofs-5.0.6-fix-paged-query-more-results-check.patch create mode 100644 autofs-5.0.6-fix-result-null-check-in-read_one_map.patch create mode 100644 autofs-5.0.6-fix-submount-shutdown-race.patch create mode 100644 autofs-5.0.6-fix-wait-for-master-source-mutex.patch create mode 100644 autofs-5.0.6-improve-mount-location-error-reporting.patch diff --git a/autofs-5.0.6-add-dir-map-type.patch b/autofs-5.0.6-add-dir-map-type.patch index 056076e..f4977de 100644 --- a/autofs-5.0.6-add-dir-map-type.patch +++ b/autofs-5.0.6-add-dir-map-type.patch @@ -44,16 +44,29 @@ included or not: the file which name ends with ".autofs" is included. Signed-off-by: Masatake YAMATO --- + CHANGELOG | 1 autofs.spec | 2 daemon/lookup.c | 3 - man/auto.master.5.in | 10 ++ modules/Makefile | 6 + modules/lookup_dir.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ samples/auto.master | 4 + - 6 files changed, 239 insertions(+), 5 deletions(-) + 7 files changed, 240 insertions(+), 5 deletions(-) create mode 100644 modules/lookup_dir.c +diff --git a/CHANGELOG b/CHANGELOG +index 7e86c84..5b988d4 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -8,6 +8,7 @@ + - fix LDAP result leaks on error paths. + - code analysis fixes part 1. + - fix not bind mounting local filesystem. ++- add "dir" map-type. + + 28/06/2011 autofs-5.0.6 + ----------------------- diff --git a/autofs.spec b/autofs.spec index 91d4f8b..82edd1e 100644 --- a/autofs.spec diff --git a/autofs-5.0.6-add-disable-move-mount-configure-option.patch b/autofs-5.0.6-add-disable-move-mount-configure-option.patch new file mode 100644 index 0000000..45c81de --- /dev/null +++ b/autofs-5.0.6-add-disable-move-mount-configure-option.patch @@ -0,0 +1,334 @@ +autofs-5.0.6 - add disable move mount configure option + +From: Ian Kent + +With the introduction of systemd the root filesystem is now usually +marked as shared instead of private as part of the systemd sandbox +functionality. As a consequence moving a mount from one mount point +to another is not allowed. + +To resolve this a configure option (--disable-move-mount) to disable +autofs preparing mount tree and then moving it into place has been +added. The move mount use in autofs was needed for a small set of +automount types with older kernels (prior to 2.6.39). So to disable +the use of move mount it's necessary to use a recent kernel. +--- + + CHANGELOG | 1 + + autofs.spec | 2 +- + configure | 18 ++++++++++++++++++ + configure.in | 10 ++++++++++ + daemon/automount.c | 11 +++++++++++ + include/config.h.in | 3 +++ + modules/mount_nfs.c | 5 ----- + modules/parse_sun.c | 40 +++++++++++++++++++++++++++++++++++----- + 8 files changed, 79 insertions(+), 11 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index 304b6a2..c682f94 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -12,6 +12,7 @@ + - fix wait for master source mutex. + - fix submount shutdown race. + - fix fix map source check in file lookup. ++- add disable move mount configure option. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/autofs.spec b/autofs.spec +index 82edd1e..510ef76 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -57,7 +57,7 @@ inkludera n + echo %{version}-%{release} > .version + + %build +-CFLAGS="$RPM_OPT_FLAGS -Wall" ./configure --libdir=%{_libdir} --disable-mount-locking --enable-ignore-busy --with-libtirpc ++CFLAGS="$RPM_OPT_FLAGS -Wall" ./configure --libdir=%{_libdir} --disable-mount-locking --enable-ignore-busy --with-libtirpc --disable-mount-move + CFLAGS="$RPM_OPT_FLAGS -Wall" make initdir=/etc/rc.d/init.d DONTSTRIP=1 + + %install +diff --git a/configure b/configure +index b5a3608..76b6d86 100755 +--- a/configure ++++ b/configure +@@ -704,6 +704,7 @@ with_openldap + with_sasl + enable_ext_env + enable_mount_locking ++enable_mount_move + enable_forced_shutdown + enable_ignore_busy + ' +@@ -1326,6 +1327,7 @@ Optional Features: + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-ext-env disable search in environment for substitution variable + --disable-mount-locking disable use of locking when spawning mount command ++ --disable-mount-move disable use of mount move when when preparing tree of mounts + --enable-force-shutdown enable USR1 signal to force unlink umount of any + busy mounts during shutdown + --enable-ignore-busy enable exit without umounting busy mounts during +@@ -5349,6 +5351,22 @@ $as_echo "#define ENABLE_MOUNT_LOCKING 1" >>confdefs.h + fi + + # ++# Disable use of mount move ++# ++# Check whether --enable-mount-move was given. ++if test "${enable_mount_move+set}" = set; then : ++ enableval=$enable_mount_move; ++else ++ enableval=yes ++fi ++ ++if test x$enable_mount_move = xyes -o x$enableval = xyes; then ++ ++$as_echo "#define ENABLE_MOUNT_MOVE 1" >>confdefs.h ++ ++fi ++ ++# + # Enable forced shutdown on USR1 signal (unlink umounts all mounts). + # + # Check whether --enable-forced-shutdown was given. +diff --git a/configure.in b/configure.in +index 46de65a..d3e4e54 100644 +--- a/configure.in ++++ b/configure.in +@@ -324,6 +324,16 @@ if test x$enable_mount_locking = xyes -o x$enableval = xyes; then + fi + + # ++# Disable use of mount move ++# ++AC_ARG_ENABLE(mount-move, ++[ --disable-mount-move disable use of mount move when when preparing tree of mounts],, ++ enableval=yes) ++if test x$enable_mount_move = xyes -o x$enableval = xyes; then ++ AC_DEFINE(ENABLE_MOUNT_MOVE, 1, [Disable use of mount move when preparing tree of mounts]) ++fi ++ ++# + # Enable forced shutdown on USR1 signal (unlink umounts all mounts). + # + AC_ARG_ENABLE(forced-shutdown, +diff --git a/daemon/automount.c b/daemon/automount.c +index 4f3151f..6bb5aa8 100644 +--- a/daemon/automount.c ++++ b/daemon/automount.c +@@ -1743,9 +1743,20 @@ static void show_build_info(void) + count = 22; + #endif + ++#ifndef ENABLE_MOUNT_MOVE ++ printf("DISABLE_MOUNT_MOVE "); ++ count = count + 19; ++#endif ++ + #ifdef ENABLE_FORCED_SHUTDOWN + printf("ENABLE_FORCED_SHUTDOWN "); + count = count + 23; ++ ++ if (count > 60) { ++ printf("\n "); ++ count = 0; ++ } ++ + #endif + + #ifdef ENABLE_IGNORE_BUSY_MOUNTS +diff --git a/include/config.h.in b/include/config.h.in +index 4a3a990..97a8d2d 100644 +--- a/include/config.h.in ++++ b/include/config.h.in +@@ -12,6 +12,9 @@ + /* Disable use of locking when spawning mount command */ + #undef ENABLE_MOUNT_LOCKING + ++/* Disable use of mount move when preparing tree of mounts */ ++#undef ENABLE_MOUNT_MOVE ++ + /* define if you have E2FSCK */ + #undef HAVE_E2FSCK + +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 8b567d2..7eab728 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -163,11 +163,6 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + if (root[len - 1] == '/') { + len = snprintf(fullpath, len, "%s", root); + } else if (*name == '/') { +- /* +- * Direct or offset mount, name is absolute path so +- * don't use root (but with move mount changes root +- * is now the same as name). +- */ + len = sprintf(fullpath, "%s", root); + } else { + len = sprintf(fullpath, "%s/%s", root, name); +diff --git a/modules/parse_sun.c b/modules/parse_sun.c +index 021850d..13b8af8 100644 +--- a/modules/parse_sun.c ++++ b/modules/parse_sun.c +@@ -1028,6 +1028,7 @@ static int parse_mapent(const char *ent, char *g_options, char **options, char * + return (p - ent); + } + ++#ifdef ENABLE_MOUNT_MOVE + static int move_mount(struct autofs_point *ap, + const char *mm_tmp_root, const char *mm_root, + unsigned int move) +@@ -1063,6 +1064,7 @@ static int move_mount(struct autofs_point *ap, + + return 1; + } ++#endif + + static void cleanup_multi_root(struct autofs_point *ap, const char *root, + const char *path, unsigned int move) +@@ -1145,6 +1147,7 @@ static void cleanup_multi_triggers(struct autofs_point *ap, + return; + } + ++#ifdef ENABLE_MOUNT_MOVE + static int check_fstype_autofs_option(const char *options) + { + char *tok, *tokbuf; +@@ -1171,24 +1174,27 @@ static int check_fstype_autofs_option(const char *options) + + return found; + } ++#endif + + static int mount_subtree(struct autofs_point *ap, struct mapent *me, + const char *name, char *loc, char *options, void *ctxt) + { + struct mapent *mm; + struct mapent *ro; +- char t_dir[] = "/tmp/autoXXXXXX"; +- char *mnt_tmp_root, *mm_root, *mm_base, *mm_key; ++ char *mm_root, *mm_base, *mm_key; + const char *mnt_root, *target; + unsigned int mm_root_len, mnt_root_len; + int start, ret = 0, rv; +- unsigned int move; ++ unsigned int move = MOUNT_MOVE_NONE; ++#ifdef ENABLE_MOUNT_MOVE ++ char t_dir[] = "/tmp/autoXXXXXX"; ++ char *mnt_tmp_root = NULL; ++#endif + + rv = 0; + + mm = me->multi; + mm_key = mm->key; +- move = MOUNT_MOVE_NONE; + + if (*mm_key == '/') { + mm_root = mm_key; +@@ -1202,7 +1208,10 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + } + mm_root_len = strlen(mm_root); + +- mnt_tmp_root = NULL; ++#ifndef ENABLE_MOUNT_MOVE ++ mnt_root = mm_root; ++ mnt_root_len = mm_root_len; ++#else + if (ap->flags & MOUNT_FLAG_REMOUNT) { + mnt_root = mm_root; + mnt_root_len = mm_root_len; +@@ -1213,6 +1222,7 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + mnt_root_len = strlen(mnt_root); + mnt_tmp_root = (char *) mnt_root; + } ++#endif + + if (me == me->multi) { + /* name = NULL */ +@@ -1238,11 +1248,13 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + } + ro_len = strlen(ro_loc); + ++#ifdef ENABLE_MOUNT_MOVE + if (!(ap->flags & MOUNT_FLAG_REMOUNT)) { + move = MOUNT_MOVE_OTHER; + if (check_fstype_autofs_option(myoptions)) + move = MOUNT_MOVE_AUTOFS; + } ++#endif + + tmp = alloca(mnt_root_len + 1); + strcpy(tmp, mnt_root); +@@ -1266,7 +1278,9 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + goto error_out; + } + } else if (rv <= 0) { ++#ifdef ENABLE_MOUNT_MOVE + move = MOUNT_MOVE_NONE; ++#endif + ret = mount_multi_triggers(ap, me, mm_root, start, mm_base); + if (ret == -1) { + error(ap->logopt, MODPREFIX +@@ -1279,11 +1293,21 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + int loclen = strlen(loc); + int namelen = strlen(name); + ++#ifndef ENABLE_MOUNT_MOVE ++ /* ++ * When using move mount to mount offsets or direct mounts ++ * the base of the tree can be the base of the temporary ++ * mount point it needs to be the full path when not moving ++ * the mount after construction. ++ */ ++ mnt_root = name; ++#else + if (!(ap->flags & MOUNT_FLAG_REMOUNT)) { + move = MOUNT_MOVE_OTHER; + if (check_fstype_autofs_option(options)) + move = MOUNT_MOVE_AUTOFS; + } ++#endif + + /* name = mm_root + mm_base */ + /* destination = mm_root + mm_base = name */ +@@ -1303,7 +1327,9 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + } else if (rv < 0) { + char *mm_root_base = alloca(strlen(mm_root) + strlen(mm_base) + 1); + ++#ifdef ENABLE_MOUNT_MOVE + move = MOUNT_MOVE_NONE; ++#endif + + strcpy(mm_root_base, mm_root); + strcat(mm_root_base, mm_base); +@@ -1318,6 +1344,7 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + } + } + ++#ifdef ENABLE_MOUNT_MOVE + if (!move_mount(ap, mnt_root, target, move)) { + cleanup_multi_triggers(ap, me, mnt_root, start, mm_base); + cleanup_multi_root(ap, mnt_root, mm_root, move); +@@ -1326,6 +1353,7 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + + if (mnt_tmp_root) + rmdir(mnt_tmp_root); ++#endif + + /* Mount for base of tree failed */ + if (rv > 0) +@@ -1341,8 +1369,10 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + return rv; + + error_out: ++#ifdef ENABLE_MOUNT_MOVE + if (mnt_tmp_root) + rmdir(mnt_tmp_root); ++#endif + + return 1; + } diff --git a/autofs-5.0.6-code-analysis-fixes-1.patch b/autofs-5.0.6-code-analysis-fixes-1.patch new file mode 100644 index 0000000..6b0c902 --- /dev/null +++ b/autofs-5.0.6-code-analysis-fixes-1.patch @@ -0,0 +1,101 @@ +autofs-5.0.6 - code analysis fixes 1 + +From: Ian Kent + +Code analysis defect fixes, installment 1. + +- fix signed usage of unsigned variable in do_srv_query(). +- make NULL check handling of variable dcs explicit in get_dc_list(). + - adding an explicit NULL check for variable dcs gaurds against + future changes in get_srv_rrs() returning success while not + clearing the dcs variable. + - makes it explict for readers why we don't need to check for NULL + before free later in the loop. +- fix typo in do_reconnect() + - uri is never set now and, at this point, we need to try to connect + to the last server uri (ctxt->uri->uri) which is set in find_server() + when ctxt->uri is NULL. +--- + + CHANGELOG | 1 + + modules/dclist.c | 11 +++++------ + modules/lookup_ldap.c | 3 +-- + 3 files changed, 7 insertions(+), 8 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index dc91c25..acc5f0c 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -6,6 +6,7 @@ + - fix dumpmaps not reading maps. + - fix result null check in read_one_map(). + - fix LDAP result leaks on error paths. ++- code analysis fixes part 1. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/dclist.c b/modules/dclist.c +index aeb107f..d16b913 100644 +--- a/modules/dclist.c ++++ b/modules/dclist.c +@@ -69,7 +69,7 @@ static void dclist_mutex_unlock(void) + + static int do_srv_query(unsigned int logopt, char *name, u_char **packet) + { +- unsigned int len = PACKETSZ; ++ int len = PACKETSZ; + unsigned int last_len = len; + char ebuf[MAX_ERR_BUF]; + u_char *buf; +@@ -500,7 +500,8 @@ struct dclist *get_dc_list(unsigned int logopt, const char *uri) + } + + dclist_mutex_lock(); +- if (!get_srv_rrs(logopt, request, &dcs, &numdcs)) { ++ ret = get_srv_rrs(logopt, request, &dcs, &numdcs); ++ if (!ret | !dcs) { + error(logopt, + "DNS SRV query failed for domain %s", domain); + dclist_mutex_unlock(); +@@ -526,8 +527,7 @@ struct dclist *get_dc_list(unsigned int logopt, const char *uri) + if (!tmp) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(logopt, "realloc: %s", estr); +- if (dcs) +- free_srv_rrs(dcs, numdcs); ++ free_srv_rrs(dcs, numdcs); + goto out_error; + } + +@@ -548,8 +548,7 @@ struct dclist *get_dc_list(unsigned int logopt, const char *uri) + if (ret > 6) { + error(logopt, + "invalid port: %u", dcs[i].port); +- if (dcs) +- free_srv_rrs(dcs, numdcs); ++ free_srv_rrs(dcs, numdcs); + goto out_error; + } + strcat(tmp, port); +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index 29323b2..67a6834 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -736,7 +736,6 @@ static LDAP *find_server(unsigned logopt, struct lookup_context *ctxt) + static LDAP *do_reconnect(unsigned logopt, struct lookup_context *ctxt) + { + LDAP *ldap = NULL; +- char *uri; + + if (ctxt->server || !ctxt->uris) { + ldap = do_connect(logopt, ctxt->server, ctxt); +@@ -780,7 +779,7 @@ static LDAP *do_reconnect(unsigned logopt, struct lookup_context *ctxt) + */ + if (!ldap) { + autofs_sasl_dispose(ctxt); +- ldap = connect_to_server(logopt, uri, ctxt); ++ ldap = connect_to_server(logopt, ctxt->uri->uri, ctxt); + } + #endif + if (ldap) diff --git a/autofs-5.0.6-fix-LDAP-result-leaks-on-error-paths.patch b/autofs-5.0.6-fix-LDAP-result-leaks-on-error-paths.patch new file mode 100644 index 0000000..809021e --- /dev/null +++ b/autofs-5.0.6-fix-LDAP-result-leaks-on-error-paths.patch @@ -0,0 +1,56 @@ +autofs-5.0.6 - Fix LDAP result leaks on error paths + +From: Leonardo Chiquitto + +According to ldap_search_s(3), the result structure must be freed +with ldap_msgfree() even when the search function returned failure. +--- + + CHANGELOG | 1 + + modules/lookup_ldap.c | 6 ++++++ + 2 files changed, 7 insertions(+), 0 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index 66b804f..dc91c25 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -5,6 +5,7 @@ + - fix paged query more results check. + - fix dumpmaps not reading maps. + - fix result null check in read_one_map(). ++- fix LDAP result leaks on error paths. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index 22ff355..29323b2 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -347,6 +347,8 @@ static int get_query_dn(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt + error(logopt, + MODPREFIX "query failed for %s: %s", + query, ldap_err2string(rv)); ++ if (result) ++ ldap_msgfree(result); + free(query); + return 0; + } +@@ -1573,6 +1575,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) + error(logopt, MODPREFIX "query failed for %s: %s", + query, ldap_err2string(rv)); + unbind_ldap_connection(logging, ldap, ctxt); ++ if (result) ++ ldap_msgfree(result); + free(query); + return NSS_STATUS_NOTFOUND; + } +@@ -2586,6 +2590,8 @@ static int lookup_one(struct autofs_point *ap, + if ((rv != LDAP_SUCCESS) || !result) { + crit(ap->logopt, MODPREFIX "query failed for %s", query); + unbind_ldap_connection(ap->logopt, ldap, ctxt); ++ if (result) ++ ldap_msgfree(result); + free(query); + return CHE_FAIL; + } diff --git a/autofs-5.0.6-fix-dumpmaps-not-reading-maps.patch b/autofs-5.0.6-fix-dumpmaps-not-reading-maps.patch new file mode 100644 index 0000000..2f7ef27 --- /dev/null +++ b/autofs-5.0.6-fix-dumpmaps-not-reading-maps.patch @@ -0,0 +1,47 @@ +autofs-5.0.6 - fix dumpmaps not reading maps + +From: Ian Kent + +The lookup modules won't read any indirect map entries (other than those +in a file map) unless unless the browse option is set. In order to list +the entries when tyhe dumpmap option is given the browse option needs to +be set. +--- + + CHANGELOG | 1 + + lib/master.c | 9 +++++++++ + 2 files changed, 10 insertions(+), 0 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index 884a9ae..946a196 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -3,6 +3,7 @@ + - fix ipv6 name for lookup fix. + - improve mount location error reporting. + - fix paged query more results check. ++- fix dumpmaps not reading maps. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/lib/master.c b/lib/master.c +index 153a38b..6c89e1d 100644 +--- a/lib/master.c ++++ b/lib/master.c +@@ -1283,6 +1283,15 @@ int master_show_mounts(struct master *master) + printf("\nMount point: %s\n", ap->path); + printf("\nsource(s):\n"); + ++ /* ++ * Ensure we actually read indirect map entries so we can ++ * list them. The map reads won't read any indirect map ++ * entries (other than those in a file map) unless the ++ * browse option is set. ++ */ ++ if (ap->type == LKP_INDIRECT) ++ ap->flags |= MOUNT_FLAG_GHOST; ++ + /* Read the map content into the cache */ + if (lookup_nss_read_map(ap, NULL, now)) + lookup_prune_cache(ap, now); diff --git a/autofs-5.0.6-fix-fix-map-source-check-in-file-lookup.patch b/autofs-5.0.6-fix-fix-map-source-check-in-file-lookup.patch new file mode 100644 index 0000000..88b4a5d --- /dev/null +++ b/autofs-5.0.6-fix-fix-map-source-check-in-file-lookup.patch @@ -0,0 +1,40 @@ +autofs-5.0.6 - fix fix map source check in file lookup + +From: Ian Kent + +A recent change to correct a problem with included map entry removal +has broken a different case of included map key lookup. The check in +previous patch was too broad and caused map key lookup for keys in an +included multi-mount map entrys to not be found. +--- + + CHANGELOG | 1 + + modules/lookup_file.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index cb9ac75..304b6a2 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -11,6 +11,7 @@ + - add "dir" map-type. + - fix wait for master source mutex. + - fix submount shutdown race. ++- fix fix map source check in file lookup. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/lookup_file.c b/modules/lookup_file.c +index 8ead07c..63b5ae7 100644 +--- a/modules/lookup_file.c ++++ b/modules/lookup_file.c +@@ -1046,7 +1046,7 @@ do_cache_lookup: + * instance (same map entry cache), not in a distinct source. + */ + if (me && (!me->mapent || +- (ap->type == LKP_INDIRECT && me->source != source))) { ++ (me->source != source && *me->key != '/'))) { + while ((me = cache_lookup_key_next(me))) + if (me->source == source) + break; diff --git a/autofs-5.0.6-fix-not-bind-mounting-local-filesystem.patch b/autofs-5.0.6-fix-not-bind-mounting-local-filesystem.patch new file mode 100644 index 0000000..099ac11 --- /dev/null +++ b/autofs-5.0.6-fix-not-bind-mounting-local-filesystem.patch @@ -0,0 +1,56 @@ +autofs-5.0.6 - fix not bind mounting local filesystem + +From: Ian Kent + +When the --random-multimount-selection (-r) option is used automount(8) +won't bind mount a local filesystem. If the filesystem that has been +requested is local it should always be used. +--- + + CHANGELOG | 1 + + modules/replicated.c | 12 +++++++----- + 2 files changed, 8 insertions(+), 5 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index acc5f0c..7e86c84 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -7,6 +7,7 @@ + - fix result null check in read_one_map(). + - fix LDAP result leaks on error paths. + - code analysis fixes part 1. ++- fix not bind mounting local filesystem. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/replicated.c b/modules/replicated.c +index a10a817..eee1a06 100644 +--- a/modules/replicated.c ++++ b/modules/replicated.c +@@ -1068,18 +1068,20 @@ static int add_new_host(struct host **list, + * We can't use PROXIMITY_LOCAL or we won't perform an RPC ping + * to remove hosts that may be down. + */ +- if (options & MOUNT_FLAG_RANDOM_SELECT) ++ if (!host_addr) + prx = PROXIMITY_SUBNET; + else { + prx = get_proximity(host_addr->ai_addr); + /* + * If we want the weight to be the determining factor +- * when selecting a host then all hosts must have the +- * same proximity. However, if this is the local machine +- * it should always be used since it is certainly available. ++ * when selecting a host, or we are using random selection, ++ * then all hosts must have the same proximity. However, ++ * if this is the local machine it should always be used ++ * since it is certainly available. + */ + if (prx != PROXIMITY_LOCAL && +- (options & MOUNT_FLAG_USE_WEIGHT_ONLY)) ++ (options & (MOUNT_FLAG_USE_WEIGHT_ONLY | ++ MOUNT_FLAG_RANDOM_SELECT))) + prx = PROXIMITY_SUBNET; + } + diff --git a/autofs-5.0.6-fix-paged-query-more-results-check.patch b/autofs-5.0.6-fix-paged-query-more-results-check.patch new file mode 100644 index 0000000..b842521 --- /dev/null +++ b/autofs-5.0.6-fix-paged-query-more-results-check.patch @@ -0,0 +1,87 @@ +autofs-5.0.6 - fix paged query more results check + +From: Ian Kent + +When getting paged results from an LDAP server the server returns an +opaque cookie (of type berval) that is used to retrieve the next page. +The criteria for deciding if there are more pages is that the berval +value is non-null and has a non-zero length. + +To determine if the berval value has non-zero length autofs checks the +strlen() of the value but on ppc64 and s390x this can return 0 even if +the value has non-zero length causing a premature termination of the +query. + +Fix this by also checking the berval length field. +Also make sure we free the opaque cookie when the query is finished. +--- + + CHANGELOG | 1 + + modules/lookup_ldap.c | 13 ++++++++++++- + 2 files changed, 13 insertions(+), 1 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index a178b74..884a9ae 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -2,6 +2,7 @@ + ======================= + - fix ipv6 name for lookup fix. + - improve mount location error reporting. ++- fix paged query more results check. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index 719fed1..a25050a 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -2041,7 +2041,8 @@ do_paged: + rv = ldap_parse_page_control(sp->ldap, + returnedControls, &sp->totalCount, + &sp->cookie); +- if (sp->cookie && sp->cookie->bv_val && strlen(sp->cookie->bv_val)) ++ if (sp->cookie && sp->cookie->bv_val && ++ (strlen(sp->cookie->bv_val) || sp->cookie->bv_len)) + sp->morePages = TRUE; + else + sp->morePages = FALSE; +@@ -2382,6 +2383,10 @@ static int read_one_map(struct autofs_point *ap, + rv == LDAP_SIZELIMIT_EXCEEDED) { + if (sp.result) + ldap_msgfree(sp.result); ++ if (sp.cookie) { ++ ber_bvfree(sp.cookie); ++ sp.cookie = NULL; ++ } + sp.pageSize = sp.pageSize / 2; + if (sp.pageSize < 5) { + debug(ap->logopt, MODPREFIX +@@ -2397,6 +2402,8 @@ static int read_one_map(struct autofs_point *ap, + if (rv != LDAP_SUCCESS || !sp.result) { + unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); + *result_ldap = rv; ++ if (sp.cookie) ++ ber_bvfree(sp.cookie); + free(sp.query); + return NSS_STATUS_UNAVAIL; + } +@@ -2406,6 +2413,8 @@ static int read_one_map(struct autofs_point *ap, + ldap_msgfree(sp.result); + unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); + *result_ldap = rv; ++ if (sp.cookie) ++ ber_bvfree(sp.cookie); + free(sp.query); + return NSS_STATUS_NOTFOUND; + } +@@ -2417,6 +2426,8 @@ static int read_one_map(struct autofs_point *ap, + unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); + + source->age = age; ++ if (sp.cookie) ++ ber_bvfree(sp.cookie); + free(sp.query); + + return NSS_STATUS_SUCCESS; diff --git a/autofs-5.0.6-fix-result-null-check-in-read_one_map.patch b/autofs-5.0.6-fix-result-null-check-in-read_one_map.patch new file mode 100644 index 0000000..ac888d2 --- /dev/null +++ b/autofs-5.0.6-fix-result-null-check-in-read_one_map.patch @@ -0,0 +1,58 @@ +autofs-5.0.6 - fix result null check in read_one_map() + +From: Ian Kent + +Fix the check and reset to NULL of the LDAP library allocated result +within the loop to fetch paged query values. +--- + + CHANGELOG | 1 + + modules/lookup_ldap.c | 7 ++++++- + 2 files changed, 7 insertions(+), 1 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index 946a196..66b804f 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -4,6 +4,7 @@ + - improve mount location error reporting. + - fix paged query more results check. + - fix dumpmaps not reading maps. ++- fix result null check in read_one_map(). + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index a25050a..22ff355 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -2381,8 +2381,10 @@ static int read_one_map(struct autofs_point *ap, + + if (rv == LDAP_ADMINLIMIT_EXCEEDED || + rv == LDAP_SIZELIMIT_EXCEEDED) { +- if (sp.result) ++ if (sp.result) { + ldap_msgfree(sp.result); ++ sp.result = NULL; ++ } + if (sp.cookie) { + ber_bvfree(sp.cookie); + sp.cookie = NULL; +@@ -2402,6 +2404,8 @@ static int read_one_map(struct autofs_point *ap, + if (rv != LDAP_SUCCESS || !sp.result) { + unbind_ldap_connection(ap->logopt, sp.ldap, ctxt); + *result_ldap = rv; ++ if (sp.result) ++ ldap_msgfree(sp.result); + if (sp.cookie) + ber_bvfree(sp.cookie); + free(sp.query); +@@ -2419,6 +2423,7 @@ static int read_one_map(struct autofs_point *ap, + return NSS_STATUS_NOTFOUND; + } + ldap_msgfree(sp.result); ++ sp.result = NULL; + } while (sp.morePages == TRUE); + + debug(ap->logopt, MODPREFIX "done updating map"); diff --git a/autofs-5.0.6-fix-submount-shutdown-race.patch b/autofs-5.0.6-fix-submount-shutdown-race.patch new file mode 100644 index 0000000..1bd908d --- /dev/null +++ b/autofs-5.0.6-fix-submount-shutdown-race.patch @@ -0,0 +1,141 @@ +autofs-5.0.6 - fix submount shutdown race + +From: Ian Kent + +Shutdown of submounts is problematic because the kernel doesn't +know when they are going away and so cannot block path walks +while they shut down. After aquiring the locks that cause mount +requests to wait, the daemon checks if the submount is active before +finally umounting it. If the mount is found to be busy the shutdown +is abandoned and the submount returned to a ready state. + +But, if a mount request arrives at the same time as the daemon is +attempting to aquire these locks pthreads appears to become confused +and blocks. So change to using the try version of the lock call and +handling the return appropriately. +--- + + CHANGELOG | 1 + + daemon/automount.c | 76 ++++++++++++++++++++++++++++++++++++++++------------ + 2 files changed, 60 insertions(+), 17 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index cac450f..cb9ac75 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -10,6 +10,7 @@ + - fix not bind mounting local filesystem. + - add "dir" map-type. + - fix wait for master source mutex. ++- fix submount shutdown race. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/daemon/automount.c b/daemon/automount.c +index 376e965..4f3151f 100644 +--- a/daemon/automount.c ++++ b/daemon/automount.c +@@ -1495,6 +1495,41 @@ static void handle_mounts_cleanup(void *arg) + return; + } + ++static int submount_source_writelock_nested(struct autofs_point *ap) ++{ ++ struct autofs_point *parent = ap->parent; ++ int status; ++ ++ status = pthread_rwlock_trywrlock(&parent->entry->source_lock); ++ if (status) ++ goto done; ++ ++ mounts_mutex_lock(parent); ++ ++ status = pthread_rwlock_trywrlock(&ap->entry->source_lock); ++ if (status) { ++ mounts_mutex_unlock(parent); ++ master_source_unlock(parent->entry); ++ } ++ ++done: ++ if (status && status != EBUSY) { ++ logmsg("submount nested master_mapent source write lock failed"); ++ fatal(status); ++ } ++ ++ return status; ++} ++ ++static void submount_source_unlock_nested(struct autofs_point *ap) ++{ ++ struct autofs_point *parent = ap->parent; ++ ++ master_source_unlock(ap->entry); ++ mounts_mutex_unlock(parent); ++ master_source_unlock(parent->entry); ++} ++ + void *handle_mounts(void *arg) + { + struct startup_cond *suc; +@@ -1565,23 +1600,32 @@ void *handle_mounts(void *arg) + master_mutex_lock(); + + if (ap->submount) { +- master_source_writelock(ap->parent->entry); +- mounts_mutex_lock(ap->parent); +- } +- +- master_source_writelock(ap->entry); ++ /* ++ * If a mount request arrives before the locks are ++ * aquired just return to ready state. ++ */ ++ ret = submount_source_writelock_nested(ap); ++ if (ret) { ++ warn(ap->logopt, ++ "can't shutdown submount: mount in progress"); ++ /* Return to ST_READY is done immediately */ ++ st_add_task(ap, ST_READY); ++ master_mutex_unlock(); ++ pthread_setcancelstate(cur_state, NULL); ++ continue; ++ } ++ } else ++ master_source_writelock(ap->entry); + + if (ap->state != ST_SHUTDOWN) { + if (!ap->submount) + alarm_add(ap, ap->exp_runfreq); + /* Return to ST_READY is done immediately */ + st_add_task(ap, ST_READY); +- master_source_unlock(ap->entry); +- if (ap->submount) { +- mounts_mutex_unlock(ap->parent); +- master_source_unlock(ap->parent->entry); +- } +- ++ if (ap->submount) ++ submount_source_unlock_nested(ap); ++ else ++ master_source_unlock(ap->entry); + master_mutex_unlock(); + + pthread_setcancelstate(cur_state, NULL); +@@ -1621,12 +1665,10 @@ void *handle_mounts(void *arg) + alarm_add(ap, ap->exp_runfreq); + /* Return to ST_READY is done immediately */ + st_add_task(ap, ST_READY); +- master_source_unlock(ap->entry); +- if (ap->submount) { +- mounts_mutex_unlock(ap->parent); +- master_source_unlock(ap->parent->entry); +- } +- ++ if (ap->submount) ++ submount_source_unlock_nested(ap); ++ else ++ master_source_unlock(ap->entry); + master_mutex_unlock(); + + pthread_setcancelstate(cur_state, NULL); diff --git a/autofs-5.0.6-fix-wait-for-master-source-mutex.patch b/autofs-5.0.6-fix-wait-for-master-source-mutex.patch new file mode 100644 index 0000000..54e24ad --- /dev/null +++ b/autofs-5.0.6-fix-wait-for-master-source-mutex.patch @@ -0,0 +1,84 @@ +autofs-5.0.6 - fix wait for master source mutex + +From: Ian Kent + +A previous change that was meant to handle the case where the master map +source mutex read lock count was exceeded was incorrectly done for the +write lock case instead of the read lock case. +--- + + CHANGELOG | 1 + + lib/master.c | 30 +++++++++++++++--------------- + 2 files changed, 16 insertions(+), 15 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index 5b988d4..cac450f 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -9,6 +9,7 @@ + - code analysis fixes part 1. + - fix not bind mounting local filesystem. + - add "dir" map-type. ++- fix wait for master source mutex. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/lib/master.c b/lib/master.c +index 6c89e1d..87d1269 100644 +--- a/lib/master.c ++++ b/lib/master.c +@@ -540,38 +540,38 @@ void send_map_update_request(struct autofs_point *ap) + + void master_source_writelock(struct master_mapent *entry) + { +- int retries = 5; /* 1 second maximum */ + int status; + +- while (retries--) { +- status = pthread_rwlock_wrlock(&entry->source_lock); +- if (status != EAGAIN) +- break; +- else { +- struct timespec t = { 0, 200000000 }; +- struct timespec r; +- while (nanosleep(&t, &r) == -1 && errno == EINTR) +- memcpy(&t, &r, sizeof(struct timespec)); +- } +- } +- ++ status = pthread_rwlock_wrlock(&entry->source_lock); + if (status) { + logmsg("master_mapent source write lock failed"); + fatal(status); + } +- + return; + } + + void master_source_readlock(struct master_mapent *entry) + { ++ int retries = 5; /* 1 second maximum */ + int status; + +- status = pthread_rwlock_rdlock(&entry->source_lock); ++ while (retries--) { ++ status = pthread_rwlock_tryrdlock(&entry->source_lock); ++ if (status != EAGAIN && status != EBUSY) ++ break; ++ else { ++ struct timespec t = { 0, 200000000 }; ++ struct timespec r; ++ while (nanosleep(&t, &r) == -1 && errno == EINTR) ++ memcpy(&t, &r, sizeof(struct timespec)); ++ } ++ } ++ + if (status) { + logmsg("master_mapent source read lock failed"); + fatal(status); + } ++ + return; + } + diff --git a/autofs-5.0.6-improve-mount-location-error-reporting.patch b/autofs-5.0.6-improve-mount-location-error-reporting.patch new file mode 100644 index 0000000..b0cb27d --- /dev/null +++ b/autofs-5.0.6-improve-mount-location-error-reporting.patch @@ -0,0 +1,117 @@ +autofs-5.0.6 - improve mount location error reporting + +From: Ian Kent + +Try and report a more sensible error when an invalid location is +encountered. +--- + + CHANGELOG | 1 + + modules/parse_sun.c | 32 ++++++++++++++++++-------------- + 2 files changed, 19 insertions(+), 14 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index e5dfa83..a178b74 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,6 +1,7 @@ + ??/??/20?? autofs-5.0.7 + ======================= + - fix ipv6 name for lookup fix. ++- improve mount location error reporting. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/modules/parse_sun.c b/modules/parse_sun.c +index 3242e3b..021850d 100644 +--- a/modules/parse_sun.c ++++ b/modules/parse_sun.c +@@ -853,7 +853,7 @@ add_offset_entry(struct autofs_point *ap, const char *name, + return ret; + } + +-static int validate_location(char *loc) ++static int validate_location(unsigned int logopt, char *loc) + { + char *ptr = loc; + +@@ -867,14 +867,22 @@ static int validate_location(char *loc) + * and "@" in the host name part and ipv6 addresses that + * have ":", "[" and "]". + */ +- if (check_colon(ptr)) { ++ if (!check_colon(ptr)) { ++ error(logopt, ++ "expected colon delimeter not found in location %s", ++ loc); ++ return 0; ++ } else { + while (*ptr && strncmp(ptr, ":/", 2)) { + if (!(isalnum(*ptr) || + *ptr == '-' || *ptr == '.' || *ptr == '_' || + *ptr == ',' || *ptr == '(' || *ptr == ')' || + *ptr == '#' || *ptr == '@' || *ptr == ':' || +- *ptr == '[' || *ptr == ']')) ++ *ptr == '[' || *ptr == ']')) { ++ error(logopt, "invalid character \"%c\" " ++ "found in location %s", *ptr, loc); + return 0; ++ } + ptr++; + } + +@@ -883,8 +891,10 @@ static int validate_location(char *loc) + } + + /* Must always be something following */ +- if (!*ptr) ++ if (!*ptr) { ++ error(logopt, "invalid location %s", loc); + return 0; ++ } + + return 1; + } +@@ -951,8 +961,7 @@ static int parse_mapent(const char *ent, char *g_options, char **options, char * + return 0; + } + +- if (!validate_location(loc)) { +- warn(logopt, MODPREFIX "invalid location %s", loc); ++ if (!validate_location(logopt, loc)) { + free(myoptions); + free(loc); + return 0; +@@ -985,9 +994,7 @@ static int parse_mapent(const char *ent, char *g_options, char **options, char * + return 0; + } + +- if (!validate_location(ent_chunk)) { +- warn(logopt, +- MODPREFIX "invalid location %s", ent_chunk); ++ if (!validate_location(logopt, ent_chunk)) { + free(ent_chunk); + free(myoptions); + free(loc); +@@ -1688,8 +1695,7 @@ int parse_mount(struct autofs_point *ap, const char *name, + return 1; + } + +- if (!validate_location(loc)) { +- warn(ap->logopt, MODPREFIX "invalid location %s", loc); ++ if (!validate_location(ap->logopt, loc)) { + free(loc); + free(options); + return 1; +@@ -1714,9 +1720,7 @@ int parse_mount(struct autofs_point *ap, const char *name, + return 1; + } + +- if (!validate_location(ent)) { +- warn(ap->logopt, +- MODPREFIX "invalid location %s", loc); ++ if (!validate_location(ap->logopt, ent)) { + free(ent); + free(loc); + free(options); diff --git a/autofs.spec b/autofs.spec index 7dc918b..bfe6d13 100644 --- a/autofs.spec +++ b/autofs.spec @@ -4,13 +4,24 @@ Summary: A tool for automatically mounting and unmounting filesystems Name: autofs Version: 5.0.6 -Release: 2%{?dist} +Release: 3%{?dist} Epoch: 1 License: GPLv2+ Group: System Environment/Daemons Source: ftp://ftp.kernel.org/pub/linux/daemons/autofs/v5/autofs-%{version}.tar.bz2 Patch1: autofs-5.0.6-fix-ipv6-name-for-lookup-fix.patch -Patch2: autofs-5.0.6-add-dir-map-type.patch +Patch2: autofs-5.0.6-improve-mount-location-error-reporting.patch +Patch3: autofs-5.0.6-fix-paged-query-more-results-check.patch +Patch4: autofs-5.0.6-fix-dumpmaps-not-reading-maps.patch +Patch5: autofs-5.0.6-fix-result-null-check-in-read_one_map.patch +Patch6: autofs-5.0.6-fix-LDAP-result-leaks-on-error-paths.patch +Patch7: autofs-5.0.6-code-analysis-fixes-1.patch +Patch8: autofs-5.0.6-fix-not-bind-mounting-local-filesystem.patch +Patch9: autofs-5.0.6-add-dir-map-type.patch +Patch10: autofs-5.0.6-fix-wait-for-master-source-mutex.patch +Patch11: autofs-5.0.6-fix-submount-shutdown-race.patch +Patch12: autofs-5.0.6-fix-fix-map-source-check-in-file-lookup.patch +Patch13: autofs-5.0.6-add-disable-move-mount-configure-option.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, libxml2-devel, cyrus-sasl-devel, openssl-devel module-init-tools util-linux nfs-utils e2fsprogs libtirpc-devel Conflicts: cyrus-sasl-lib < 2.1.23-9 @@ -55,10 +66,21 @@ inkludera nÀtfilsystem, CD-ROM, floppydiskar, och sÄ vidare. echo %{version}-%{release} > .version %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 %build #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir} -%configure --disable-mount-locking --enable-ignore-busy --with-libtirpc +%configure --disable-mount-locking --enable-ignore-busy --with-libtirpc --disable-mount-move make initdir=%{_initrddir} DONTSTRIP=1 %install @@ -109,6 +131,20 @@ fi %dir /etc/auto.master.d %changelog +* Tue Nov 8 2011 Ian Kent - 1:5.0.6-3 +- improve mount location error reporting. +- fix paged query more results check. +- fix dumpmaps not reading maps. +- fix result null check in read_one_map(). +- Fix LDAP result leaks on error paths. +- code analysis fixes 1. +- fix not bind mounting local filesystem. +- update dir map-type patch for changed patch order. +- fix wait for master source mutex. +- fix submount shutdown race +- fix fix map source check in file lookup. +- add disable move mount configure option. + * Wed Jul 6 2011 Ian Kent - 1:5.0.6-2 - add missing spec file entries for dir-type change (bz719208).