diff --git a/SOURCES/autofs-5.1.9-fix-deadlock-in-remount.patch b/SOURCES/autofs-5.1.9-fix-deadlock-in-remount.patch new file mode 100644 index 0000000..fba8571 --- /dev/null +++ b/SOURCES/autofs-5.1.9-fix-deadlock-in-remount.patch @@ -0,0 +1,68 @@ +autofs-5.1.9 - fix deadlock in remount + +From: Ian Kent + +If we're starting up or trying to re-connect to an existing direct mount +we could be iterating through the map entries with the cache readlock +held so we can't just take the writelock for direct mounts. But when +trying to re-connect to an existing mount at startup there won't be any +other process updating the map entry cache. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + modules/parse_sun.c | 26 ++++++++++++++++++++++++-- + 2 files changed, 25 insertions(+), 2 deletions(-) + +--- autofs-5.1.4.orig/CHANGELOG ++++ autofs-5.1.4/CHANGELOG +@@ -151,6 +151,7 @@ + - fix incorrect matching of cached wildcard key. + - fix expire retry looping. + - fix get parent multi-mount check in try_remount(). ++- fix deadlock in remount. + + xx/xx/2018 autofs-5.1.5 + - fix flag file permission. +--- autofs-5.1.4.orig/modules/parse_sun.c ++++ autofs-5.1.4/modules/parse_sun.c +@@ -881,7 +881,18 @@ update_offset_entry(struct autofs_point + strcpy(m_mapent, loc); + } + +- cache_writelock(mc); ++ /* ++ * If we're starting up or trying to re-connect to an existing ++ * direct mount we could be iterating through the map entries ++ * with the readlock held so we can't just take the writelock ++ * for direct mounts. But at when trying to re-connect to an ++ * existing mount at startup there won't be any other process ++ * updating the map entry cache. ++ */ ++ if (ap->state == ST_INIT && ap->flags & MOUNT_FLAG_REMOUNT) ++ cache_readlock(mc); ++ else ++ cache_writelock(mc); + ret = cache_update_offset(mc, name, m_key, m_mapent, age); + + me = cache_lookup_distinct(mc, m_key); +@@ -1573,7 +1584,18 @@ dont_expand: + free(myoptions); + } while (*p == '/' || (*p == '"' && *(p + 1) == '/')); + +- cache_writelock(mc); ++ /* ++ * If we're starting up or trying to re-connect to an existing ++ * direct mount we could be iterating through the map entries ++ * with the readlock held so we can't just take the writelock ++ * for direct mounts. But at when trying to re-connect to an ++ * existing mount at startup there won't be any other process ++ * updating the map entry cache. ++ */ ++ if (ap->state == ST_INIT && ap->flags & MOUNT_FLAG_REMOUNT) ++ cache_readlock(mc); ++ else ++ cache_writelock(mc); + me = cache_lookup_distinct(mc, name); + if (!me) { + cache_unlock(mc); diff --git a/SOURCES/autofs-5.1.9-fix-get-parent-multi-mount-check-in-try_remount.patch b/SOURCES/autofs-5.1.9-fix-get-parent-multi-mount-check-in-try_remount.patch new file mode 100644 index 0000000..b4c3926 --- /dev/null +++ b/SOURCES/autofs-5.1.9-fix-get-parent-multi-mount-check-in-try_remount.patch @@ -0,0 +1,43 @@ +autofs-5.1.9 - fix get parent multi-mount check in try_remount() + +From: Ian Kent + +In commit 635b90ecc (autofs-5.1.8 - fix mount tree startup reconnect) +when getting the parent the check for a multi-mount should include a +check for the root of the multi-mount as well since the root does not +set its parent (it remains NULL). + +We could set the root parent to itself but that may have side effects +because the convention has always been the parent is NULL for the +multi-mount root. + +Reported-by: Roberto Bergantinos Corpas +Suggested-by: Roberto Bergantinos Corpas + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/mounts.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +--- autofs-5.1.4.orig/CHANGELOG ++++ autofs-5.1.4/CHANGELOG +@@ -150,6 +150,7 @@ + - fix some sss error return cases. + - fix incorrect matching of cached wildcard key. + - fix expire retry looping. ++- fix get parent multi-mount check in try_remount(). + + xx/xx/2018 autofs-5.1.5 + - fix flag file permission. +--- autofs-5.1.4.orig/lib/mounts.c ++++ autofs-5.1.4/lib/mounts.c +@@ -2878,7 +2878,7 @@ int try_remount(struct autofs_point *ap, + } + + me->flags &= ~MOUNT_FLAG_DIR_CREATED; +- mapent = IS_MM(me) ? MM_PARENT(me) : me; ++ mapent = IS_MM(me) && !IS_MM_ROOT(me) ? MM_PARENT(me) : me; + /* Direct or offset mount, key is full path */ + if (mapent->key[0] == '/') { + if (!is_mounted(mapent->key, MNTS_REAL)) diff --git a/SPECS/autofs.spec b/SPECS/autofs.spec index 311640f..0d766bf 100644 --- a/SPECS/autofs.spec +++ b/SPECS/autofs.spec @@ -8,7 +8,7 @@ Summary: A tool for automatically mounting and unmounting filesystems Name: autofs Version: 5.1.4 -Release: 109%{?dist} +Release: 109%{?dist}.1 Epoch: 1 License: GPLv2+ Group: System Environment/Daemons @@ -326,6 +326,9 @@ Patch324: autofs-5.1.8-fix-some-sss-error-return-cases.patch Patch325: autofs-5.1.8-fix-incorrect-matching-of-cached-wildcard-key.patch Patch326: autofs-5.1.8-fix-expire-retry-looping.patch +Patch327: autofs-5.1.9-fix-get-parent-multi-mount-check-in-try_remount.patch +Patch328: autofs-5.1.9-fix-deadlock-in-remount.patch + %if %{with_systemd} BuildRequires: systemd-units BuildRequires: systemd-devel @@ -692,6 +695,9 @@ echo %{version}-%{release} > .version %patch325 -p1 %patch326 -p1 +%patch327 -p1 +%patch328 -p1 + %build LDFLAGS=-Wl,-z,now %configure --disable-mount-locking --enable-ignore-busy --with-libtirpc --without-hesiod %{?systemd_configure_arg:} @@ -786,6 +792,13 @@ fi %dir /etc/auto.master.d %changelog +* Thu Jan 11 2024 Ian Kent - 5.1.4-109.el8_9.1 +- RHEL-21288 - SIGSEGV using hierarchical map entries on reload with + autofs-5.1.4-109 + - fix get parent multi-mount check in try_remount(). + - fix deadlock in remount. +- Resolves: RHEL-21288 + * Fri Jul 14 2023 Ian Kent - 5.1.4-109 - bz2213267 - filesystems mount and expire immediately - fix expire retry looping.