Compare commits

..

No commits in common. "c9" and "c8" have entirely different histories.
c9 ... c8

309 changed files with 33275 additions and 3484 deletions

View File

@ -1 +1 @@
086c327711a7f76692c582264c0742842f3570ba SOURCES/autofs-5.1.7-2.tar.gz
0256f9e75e2da9185afe797f1c5bedb1604c7eb2 SOURCES/autofs-5.1.4.tar.gz

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/autofs-5.1.7-2.tar.gz
SOURCES/autofs-5.1.4.tar.gz

View File

@ -0,0 +1,66 @@
autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS
From: NeilBrown <neilb@suse.com>
The rules in Makefile make it quite clear that
'samples' is not expected to be part of SUBDIRS.
e.g.
- The rule for "clean" handles both $(SUBDIRS) *and* samples.
- There are separate "install" and "install_samples" targets.
However SUBDIRS does contain 'samples'. This means that
a simple "make; make install" will over-write your configuration files.
So remove 'samples' from SUBDIRS. Note that it has been removed in
the past, but then got added back again.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
Makefile.rules | 2 +-
autofs.spec | 6 ++++++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 313730b1..1e5ec15b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapsed.
+- Makefiles.rules: remove 'samples' from SUBDIRS.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.rules b/Makefile.rules
index 2bfa043c..4deab3b9 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,7 +3,7 @@
#
# Root directory contents
-SUBDIRS = lib daemon modules man samples
+SUBDIRS = lib daemon modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
diff --git a/autofs.spec b/autofs.spec
index 6da0655d..57d8db46 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs
install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs
+install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master
+install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc
+install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
+install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
+install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf
+
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT

View File

@ -0,0 +1,557 @@
autofs-5.1.4 - account for recent libnsl changes
From: Ian Kent <raven@themaw.net>
The glibc RPC code has been dropped.
The NIS functionality comes in the libnsl library but it installs
its files into sub directories of the system include and library
directories.
So configure needs to check for this and allow for it in the
compile and linking of the NIS and NIS+ lookup modules.
---
CHANGELOG | 1
Makefile.conf.in | 4 -
Makefile.rules | 2
aclocal.m4 | 45 ++++++++
configure | 288 ++++++++++++++++++++++++++++++++++++++++++++++++---
configure.in | 27 ++---
include/config.h.in | 3 +
modules/Makefile | 10 ++
8 files changed, 343 insertions(+), 37 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 9d19c0a7..2d5d5b1f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,7 @@ xx/xx/2018 autofs-5.1.5
- fix sublink option not set from defaults.
- fix error return in do_nfs_mount().
- add error handling for ext_mount_add().
+- account for recent libnsl changes.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.conf.in b/Makefile.conf.in
index f879e262..85662654 100644
--- a/Makefile.conf.in
+++ b/Makefile.conf.in
@@ -14,8 +14,8 @@ DAEMON_LDFLAGS = @DAEMON_LDFLAGS@
# Glibc < 2.17 requires librt for clock_gettime()
LIBCLOCK_GETTIME = @LIBCLOCK_GETTIME@
-# Special parameters for glibc (libc 6)
-LIBNSL = @LIBNSL@
+NSLLIB = @NSL_LIBS@
+NSLCFLAGS = @NSL_CFLAGS@
LIBRESOLV = @LIBRESOLV@
# Hesiod support: yes (1) no (0)
diff --git a/Makefile.rules b/Makefile.rules
index 0edf9bfe..2bfa043c 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -54,8 +54,6 @@ ifdef DMALLOCLIB
LIBS += $(DMALLOCLIB)
endif
-LIBS += $(LIBNSL)
-
LIBS += $(LIBCLOCK_GETTIME)
# Standard rules
diff --git a/aclocal.m4 b/aclocal.m4
index 51772043..f1ed3870 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -417,3 +417,48 @@ fi
LIBS="$af_check_ldap_parse_page_control_save_libs"
])
+dnl --------------------------------------------------------------------------
+dnl AF_CHECK_YPCLNT_HEADER
+dnl
+dnl Check for include file rpcsvc/ypclnt.h for YellowPages support.
+dnl --------------------------------------------------------------------------
+AC_DEFUN([AF_CHECK_YPCLNT_HEADER],
+[
+# save current CFLAGS
+af_check_ypclnt_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_YPCLNT=0
+AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
+AC_SUBST(HAVE_YPCLNT)
+if test "$HAVE_YPCLNT" = "1"; then
+ AC_DEFINE(HAVE_YPCLNT, 1,
+ [Define if using YellowPages])
+fi
+
+# restore libs
+CFLAGS="$af_check_ypclnt_header_save_cflags"
+])
+
+dnl --------------------------------------------------------------------------
+dnl AF_CHECK_NIS_HEADER
+dnl
+dnl Check for include file rpcsvc/nis.h for NIS+ support.
+dnl --------------------------------------------------------------------------
+AC_DEFUN([AF_CHECK_NIS_HEADER],
+[
+# save current CFLAGS
+af_check_nis_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_NISPLUS=0
+AC_CHECK_HEADER([rpcsvc/nis.h], HAVE_NISPLUS=1)
+AC_SUBST(HAVE_NISPLUS)
+if test "$HAVE_NISPLUS" = "1"; then
+ AC_DEFINE(HAVE_NISPLUS, 1,
+ [Define if using NIS+])
+fi
+
+# restore libs
+CFLAGS="$af_check_nis_header_save_cflags"
+])
diff --git a/configure b/configure
index 476cea4b..2d517aac 100755
--- a/configure
+++ b/configure
@@ -634,8 +634,8 @@ XML_FLAGS
LIBLDAP
HAVE_LDAP
LDAP_FLAGS
-HAVE_YPCLNT
HAVE_NISPLUS
+HAVE_YPCLNT
EGREP
GREP
CPP
@@ -643,7 +643,8 @@ HESIOD_FLAGS
LIBHESIOD
HAVE_HESIOD
LIBRESOLV
-LIBNSL
+NSL_LIBS
+NSL_CFLAGS
LIBCLOCK_GETTIME
KRB5_CONFIG
XML_CONFIG
@@ -764,6 +765,8 @@ CFLAGS
LDFLAGS
LIBS
CPPFLAGS
+NSL_CFLAGS
+NSL_LIBS
CPP'
@@ -1417,6 +1420,8 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
+ NSL_CFLAGS C compiler flags for NSL, overriding pkg-config
+ NSL_LIBS linker flags for NSL, overriding pkg-config
CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
@@ -4500,9 +4505,186 @@ fi
-#
-# glibc/libc 6 new libraries
-#
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5
+$as_echo_n "checking for NSL... " >&6; }
+
+if test -n "$NSL_CFLAGS"; then
+ pkg_cv_NSL_CFLAGS="$NSL_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_NSL_CFLAGS=`$PKG_CONFIG --cflags "libnsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$NSL_LIBS"; then
+ pkg_cv_NSL_LIBS="$NSL_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_NSL_LIBS=`$PKG_CONFIG --libs "libnsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ NSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnsl" 2>&1`
+ else
+ NSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnsl" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$NSL_PKG_ERRORS" >&5
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
$as_echo_n "checking for yp_match in -lnsl... " >&6; }
if ${ac_cv_lib_nsl_yp_match+:} false; then :
@@ -4540,10 +4722,66 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
- LIBNSL="-lnsl"
+ NSL_LIBS="-lnsl"
fi
+NSL_CFLAGS=""
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
+$as_echo_n "checking for yp_match in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_yp_match+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char yp_match ();
+int
+main ()
+{
+return yp_match ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_yp_match=yes
+else
+ ac_cv_lib_nsl_yp_match=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
+$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
+if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
+ NSL_LIBS="-lnsl"
+fi
+
+
+NSL_CFLAGS=""
+
+else
+ NSL_CFLAGS=$pkg_cv_NSL_CFLAGS
+ NSL_LIBS=$pkg_cv_NSL_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5
$as_echo_n "checking for res_query in -lresolv... " >&6; }
@@ -4659,8 +4897,6 @@ fi
LDFLAGS="${AF_tmp_ldflags}"
-# NIS+ support?
-HAVE_NISPLUS=0
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5058,15 +5294,11 @@ fi
done
-ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
-if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
- HAVE_NISPLUS=1
-fi
-
+# save current CFLAGS
+af_check_ypclnt_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
-
-# YellowPages support?
HAVE_YPCLNT=0
ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default"
if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then :
@@ -5081,6 +5313,32 @@ $as_echo "#define HAVE_YPCLNT 1" >>confdefs.h
fi
+# restore libs
+CFLAGS="$af_check_ypclnt_header_save_cflags"
+
+
+# save current CFLAGS
+af_check_nis_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_NISPLUS=0
+ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
+if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
+ HAVE_NISPLUS=1
+fi
+
+
+
+if test "$HAVE_NISPLUS" = "1"; then
+
+$as_echo "#define HAVE_NISPLUS 1" >>confdefs.h
+
+fi
+
+# restore libs
+CFLAGS="$af_check_nis_header_save_cflags"
+
+
#
# OpenLDAP support? Expect that this may have a special directory...
#
diff --git a/configure.in b/configure.in
index d3660923..d74775cc 100644
--- a/configure.in
+++ b/configure.in
@@ -209,11 +209,13 @@ fi
AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt")
AC_SUBST(LIBCLOCK_GETTIME)
-#
-# glibc/libc 6 new libraries
-#
-AC_CHECK_LIB(nsl, yp_match, LIBNSL="-lnsl")
-AC_SUBST(LIBNSL)
+PKG_PROG_PKG_CONFIG()
+PKG_CHECK_MODULES([NSL],[libnsl],,
+[
+AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl")
+AC_SUBST(NSL_LIBS)
+NSL_CFLAGS=""
+])
AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
AC_SUBST(LIBRESOLV)
@@ -254,19 +256,8 @@ AC_SUBST(LIBHESIOD)
AC_SUBST(HESIOD_FLAGS)
LDFLAGS="${AF_tmp_ldflags}"
-# NIS+ support?
-HAVE_NISPLUS=0
-AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1)
-AC_SUBST(HAVE_NISPLUS)
-
-# YellowPages support?
-HAVE_YPCLNT=0
-AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
-AC_SUBST(HAVE_YPCLNT)
-if test "$HAVE_YPCLNT" = "1"; then
- AC_DEFINE(HAVE_YPCLNT, 1,
- [Define if using YellowPages])
-fi
+AF_CHECK_YPCLNT_HEADER()
+AF_CHECK_NIS_HEADER()
#
# OpenLDAP support? Expect that this may have a special directory...
diff --git a/include/config.h.in b/include/config.h.in
index 04873e8f..991a2bda 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -57,6 +57,9 @@
/* define if you have MOUNT_NFS */
#undef HAVE_MOUNT_NFS
+/* Define if using NIS+ */
+#undef HAVE_NISPLUS
+
/* define if the umount command supports the -c option */
#undef HAVE_NO_CANON_UMOUNT
diff --git a/modules/Makefile b/modules/Makefile
index d9ab06c5..0447559a 100644
--- a/modules/Makefile
+++ b/modules/Makefile
@@ -116,6 +116,16 @@ parse_amd.so: parse_amd.c amd_parse.tab.o amd_tok.o
#
# Ad hoc compilation rules for modules which need auxilliary libraries
#
+lookup_yp.so: lookup_yp.c
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_yp.so \
+ lookup_yp.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
+ $(STRIP) lookup_yp.so
+
+lookup_nisplus.so: lookup_nisplus.c
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_nisplus.so \
+ lookup_nisplus.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
+ $(STRIP) lookup_nisplus.so
+
lookup_hesiod.so: lookup_hesiod.c
$(CC) $(SOLDFLAGS) $(CFLAGS) $(HESIOD_FLAGS) -o lookup_hesiod.so \
lookup_hesiod.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBHESIOD) $(LIBRESOLV) $(LIBS)

View File

@ -0,0 +1,34 @@
autofs-5.1.4 - add NULL check in prepare_attempt_prefix()
From: Ian Kent <raven@themaw.net>
prepare_attempt_prefix() calls calloc(3) and continues without
checking if the allocation succeeded.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/log.c | 2 ++
2 files changed, 3 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -39,6 +39,7 @@ xx/xx/2018 autofs-5.1.5
- better handle hesiod support not built in.
- fix hesiod string check in master_parse().
- remove autofs4 module load code.
+- add NULL check in prepare_attempt_prefix().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/log.c
+++ autofs-5.1.4/lib/log.c
@@ -44,6 +44,8 @@ static char *prepare_attempt_prefix(cons
snprintf(buffer, ATTEMPT_ID_SIZE, "%02lx", *attempt_id);
prefixed_msg = (char *) calloc(len, sizeof(char));
+ if (!prefixed_msg)
+ return NULL;
strcpy(prefixed_msg, buffer);
strcat(prefixed_msg, "|");
strcat(prefixed_msg, msg);

View File

@ -0,0 +1,42 @@
autofs-5.1.4 - add an example fedfs master map entry to the installed master map
From: Ian Kent <raven@themaw.net>
Add an example of using the fedfs program map (to facilitate access
to fedfs domain mounts) to the installed master map.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/auto.master | 6 ++++++
2 files changed, 7 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index bbe8019e..f771a433 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -18,6 +18,7 @@ xx/xx/2018 autofs-5.1.5
- add mount.fedfs.c.
- add fedfs-map-nfs4.c.
- add conditional inclusion of fedfs binaries.
+- add an example fedfs master map entry to the installed master map.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/samples/auto.master b/samples/auto.master
index 0f2c8ab0..9a9968a3 100644
--- a/samples/auto.master
+++ b/samples/auto.master
@@ -17,6 +17,12 @@
#
+dir:/etc/auto.master.d
#
+# If you have fedfs set up and the related binaries, either
+# built as part of autofs or installed from another package,
+# uncomment this line to use the fedfs program map to access
+# your fedfs mounts.
+#/nfs4 /usr/sbin/fedfs-map-nfs4 nobind
+#
# Include central master map if it can be found using
# nsswitch sources.
#

View File

@ -0,0 +1,184 @@
autofs-5.1.4 - add conditional inclusion of fedfs binaries
From: Ian Kent <raven@themaw.net>
Add conditional inclusion of the fedfs binaries.
Using configure a --with-fedfs is needed to build and install
the fedfs binaries.
Using rpmbuild -tb <autofs tar> it's necessary to add the option
--without fedfs to exclude the fedfs binaries from the resulting
rpm package.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
Makefile.conf.in | 2 ++
Makefile.rules | 6 +++++-
autofs.spec | 12 +++++++++++-
configure | 16 ++++++++++++++++
configure.in | 9 +++++++++
6 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 412e3382..bbe8019e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,6 +17,7 @@ xx/xx/2018 autofs-5.1.5
- add fedfs-getsrvinfo.c.
- add mount.fedfs.c.
- add fedfs-map-nfs4.c.
+- add conditional inclusion of fedfs binaries.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.conf.in b/Makefile.conf.in
index 85662654..3fe1a0a0 100644
--- a/Makefile.conf.in
+++ b/Makefile.conf.in
@@ -58,6 +58,8 @@ EXT3FS = @HAVE_E3FSCK@
# Support for calling e4fsck when mounting ext4 filesystems
EXT4FS = @HAVE_E4FSCK@
+FEDFS = @ENABLE_FEDFS@
+
LEX = @PATH_LEX@
YACC = @PATH_YACC@
RPCGEN = @PATH_RPCGEN@
diff --git a/Makefile.rules b/Makefile.rules
index fc9f6019..2ccb1f6e 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,12 +3,16 @@
#
# Root directory contents
-SUBDIRS = lib daemon fedfs modules man
+SUBDIRS = lib daemon modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
configure *.patch autofs.spec
+ifeq ($(FEDFS), 1)
+ SUBDIRS += fedfs
+endif
+
# Attempt to be friends with autotools
INSTALLROOT = $(DESTDIR)
diff --git a/autofs.spec b/autofs.spec
index 157c09b4..2cb09ef0 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -16,6 +16,10 @@
# disable them.
%define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1}
+# Use --without fedfs in your rpmbuild command or force values to 0 to
+# disable them.
+%define with_fedfs %{?_without_fedfs: 0} %{?!_without_fedfs: 1}
+
Summary: A tool from automatically mounting and umounting filesystems.
Name: autofs
%define version 5.1.4
@@ -82,6 +86,9 @@ echo %{version}-%{release} > .version
%if %{with_libtirpc}
%define libtirpc_configure_arg --with-libtirpc
%endif
+%if %{with_fedfs}
+ %define fedfs_configure_arg --enable-fedfs
+%endif
%build
CFLAGS="$RPM_OPT_FLAGS -Wall" \
@@ -90,7 +97,8 @@ LDFLAGS="-Wl,-z,now" \
--disable-mount-locking \
--enable-ignore-busy \
%{?systemd_configure_arg:} \
- %{?libtirpc_configure_arg:}
+ %{?libtirpc_configure_arg:} \
+ %{?fedfs_configure_arg:}
CFLAGS="$RPM_OPT_FLAGS -Wall" LDFLAGS="-Wl,-z,now" make initdir=/etc/rc.d/init.d DONTSTRIP=1
%install
@@ -191,8 +199,10 @@ fi
%config(noreplace) /etc/sysconfig/autofs
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
+%if %{with_fedfs}
%{_sbindir}/mount.fedfs
%{_sbindir}/fedfs-map-nfs4
+%endif
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/configure b/configure
index 5c8aae30..9682b36f 100755
--- a/configure
+++ b/configure
@@ -648,6 +648,7 @@ NSL_CFLAGS
LIBCLOCK_GETTIME
KRB5_CONFIG
XML_CONFIG
+ENABLE_FEDFS
sssldir
HAVE_SSS_AUTOFS
PATH_RPCGEN
@@ -743,6 +744,7 @@ with_libtirpc
with_dmalloc
enable_sloppy_mount
enable_no_canon_umount
+enable_fedfs
with_hesiod
with_openldap
with_sasl
@@ -1377,6 +1379,7 @@ Optional Features:
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-sloppy-mount enable the use of the -s option to mount
--enable-no-canon-umount enable the use of the -c option to umount
+ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4
--disable-ext-env disable search in environment for substitution variable
--disable-mount-locking disable use of locking when spawning mount command
--enable-force-shutdown enable USR1 signal to force unlink umount of any
@@ -4246,6 +4249,19 @@ $as_echo "#define HAVE_NO_CANON_UMOUNT 1" >>confdefs.h
fi
+ENABLE_FEDFS=""
+# Check whether --enable-fedfs was given.
+if test "${enable_fedfs+set}" = set; then :
+ enableval=$enable_fedfs;
+else
+ enable_fedfs=no
+fi
+
+if test x$enable_fedfs = xyes; then
+ ENABLE_FEDFS="1"
+fi
+
+
# LDAP SASL auth needs libxml and Kerberos
for ac_prog in xml2-config
do
diff --git a/configure.in b/configure.in
index 4d1208f5..de06a96d 100644
--- a/configure.in
+++ b/configure.in
@@ -195,6 +195,15 @@ if test x$enable_no_canon_umount = xyes; then
AC_DEFINE(HAVE_NO_CANON_UMOUNT, 1, [define if the umount command supports the -c option])
fi
+ENABLE_FEDFS=""
+AC_ARG_ENABLE(fedfs,
+[ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4],,
+ enable_fedfs=no)
+if test x$enable_fedfs = xyes; then
+ ENABLE_FEDFS="1"
+fi
+AC_SUBST(ENABLE_FEDFS)
+
# LDAP SASL auth needs libxml and Kerberos
AF_CHECK_LIBXML()
AF_CHECK_KRB5()

View File

@ -0,0 +1,121 @@
autofs-5.1.4 - add error handling for ext_mount_add()
From: Ian Kent <raven@themaw.net>
Add error handling (memory allocation failures) for ext_mount_add().
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 5 +----
modules/parse_amd.c | 42 ++++++++++++++++++++++++++++++------------
3 files changed, 32 insertions(+), 16 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index d0cfa19b..9d19c0a7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,7 @@ xx/xx/2018 autofs-5.1.5
- fix prefix option handling in expand_entry().
- fix sublink option not set from defaults.
- fix error return in do_nfs_mount().
+- add error handling for ext_mount_add().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/mounts.c b/lib/mounts.c
index 6fa304aa..f46fab2b 100644
--- a/lib/mounts.c
+++ b/lib/mounts.c
@@ -715,15 +715,12 @@ int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount
}
em = malloc(sizeof(struct ext_mount));
- if (!em) {
- ret = -1;
+ if (!em)
goto done;
- }
em->mountpoint = strdup(path);
if (!em->mountpoint) {
free(em);
- ret = -1;
goto done;
}
em->umount = umount;
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 2a5d9a30..e7debc56 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1080,7 +1080,14 @@ static int do_generic_mount(struct autofs_point *ap, const char *name,
umount = 1;
}
/* We have an external mount */
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
+ umount_ent(ap, entry->fs);
+ error(ap->logopt, MODPREFIX
+ "error: could not add external mount %s",
+ entry->fs);
+ ret = 1;
+ goto out;
+ }
ret = do_link_mount(ap, name, entry, flags);
}
out:
@@ -1124,7 +1131,13 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
umount = 1;
}
/* We might be using an external mount */
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
+ umount_ent(ap, entry->fs);
+ error(ap->logopt, MODPREFIX
+ "error: could not add external mount %s", entry->fs);
+ ret = 1;
+ goto out;
+ }
ret = do_link_mount(ap, name, entry, flags);
}
out:
@@ -1309,6 +1322,9 @@ static int do_program_mount(struct autofs_point *ap,
*/
if (ext_mount_inuse(entry->fs)) {
rv = 0;
+ /* An external mount with path entry->fs exists
+ * so ext_mount_add() won't fail.
+ */
ext_mount_add(&entry->ext_mount, entry->fs, 1);
} else {
rv = mkdir_path(entry->fs, mp_mode);
@@ -1325,17 +1341,19 @@ static int do_program_mount(struct autofs_point *ap,
rv = spawnv(ap->logopt, prog, (const char * const *) argv);
if (WIFEXITED(rv) && !WEXITSTATUS(rv)) {
- rv = 0;
- ext_mount_add(&entry->ext_mount, entry->fs, 1);
- debug(ap->logopt, MODPREFIX
- "%s: mounted %s", entry->type, entry->fs);
- } else {
- if (!ext_mount_inuse(entry->fs))
- rmdir_path(ap, entry->fs, ap->dev);
- error(ap->logopt, MODPREFIX
- "%s: failed to mount using: %s",
- entry->type, entry->mount);
+ if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) {
+ rv = 0;
+ debug(ap->logopt, MODPREFIX
+ "%s: mounted %s", entry->type, entry->fs);
+ goto do_free;
+ }
+ umount_ent(ap, entry->fs);
}
+
+ if (!ext_mount_inuse(entry->fs))
+ rmdir_path(ap, entry->fs, ap->dev);
+ error(ap->logopt, MODPREFIX
+ "%s: failed to mount using %s", entry->type, entry->mount);
}
do_free:
free_argv(argc, (const char **) argv);

View File

@ -0,0 +1,402 @@
autofs-5.1.4 - add fedfs-getsrvinfo.c
From: Ian Kent <raven@themaw.net>
Add the fedfs domain information discovery library functions.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
fedfs/fedfs-getsrvinfo.c | 311 ++++++++++++++++++++++++++++++++++++++++++++++
fedfs/fedfs-getsrvinfo.h | 52 ++++++++
3 files changed, 364 insertions(+)
create mode 100644 fedfs/fedfs-getsrvinfo.c
create mode 100644 fedfs/fedfs-getsrvinfo.h
diff --git a/CHANGELOG b/CHANGELOG
index dbfb8389..8d6c737c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,7 @@ xx/xx/2018 autofs-5.1.5
- Makefiles.rules: remove 'samples' from SUBDIRS.
- dont allow trailing slash in master map mount points.
- fix libresolv configure check.
+- add fedfs-getsrvinfo.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/fedfs/fedfs-getsrvinfo.c b/fedfs/fedfs-getsrvinfo.c
new file mode 100644
index 00000000..02ad16b5
--- /dev/null
+++ b/fedfs/fedfs-getsrvinfo.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include <stdio.h>
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <arpa/nameser_compat.h>
+#include <resolv.h>
+
+#include "fedfs-getsrvinfo.h"
+
+/**
+ * Parsing overlay for DNS query result record header. Fields are
+ * in network byte order.
+ */
+struct rechdr {
+ uint16_t type;
+ uint16_t class;
+ uint32_t ttl;
+ uint16_t length;
+} __attribute__((__packed__));
+
+/**
+ * Parsing overlay for DNS query result SRV record data. Fields
+ * are in network byte order.
+ */
+struct srv {
+ uint16_t priority;
+ uint16_t weight;
+ uint16_t port;
+ unsigned char *target;
+} __attribute__((__packed__));
+
+/**
+ * Return C string matching error value of "status"
+ *
+ * @param status error status returned by getsrvinfo
+ * @return pointer to static NUL-terminated C string containing error message
+ */
+const char *
+gsi_strerror(int status)
+{
+ static char buf[256];
+
+ switch (status) {
+ case ESI_SUCCESS:
+ return "Success";
+ case ESI_NONAME:
+ return "Name not found";
+ case ESI_AGAIN:
+ return "Temporary failure in name resolution";
+ case ESI_FAIL:
+ return "Non-recoverable failure in name resolution";
+ case ESI_NODATA:
+ return "No SRV record returned";
+ case ESI_SERVICE:
+ return "Service is not available";
+ case ESI_MEMORY:
+ return "Memory allocation failure";
+ case ESI_SYSTEM:
+ snprintf(buf, sizeof(buf), "System error (%d): %s",
+ status, strerror(errno));
+ return buf;
+ case ESI_PARSE:
+ return "Failed to parse server response";
+ }
+
+ snprintf(buf, sizeof(buf), "Unknown error (%d)", status);
+ return buf;
+}
+
+/**
+ * Release a list of SRV records allocated by getsrvinfo()
+ *
+ * @param si pointer to first element of a list of struct srvinfo
+ *
+ */
+void freesrvinfo(struct srvinfo *si)
+{
+ struct srvinfo *tmp;
+
+ while (si != NULL) {
+ tmp = si;
+ si = si->si_next;
+ free(tmp->si_target);
+ free(tmp);
+ }
+}
+
+/**
+ * Ordering predicate for srvinfo lists
+ *
+ * @param a a srvinfo list element to compare
+ * @param b another srvinfo list element to compare
+ * @return true if "b" should fall later in the list than "a"
+ *
+ * See RFC 2782. The list is ordered as follows:
+ *
+ * o Lowest priority first.
+ * o In each priority class, highest weight first.
+ */
+static _Bool
+srvinfo_is_after(const struct srvinfo *a, const struct srvinfo *b)
+{
+ if (a->si_priority > b->si_priority)
+ return true;
+ if (a->si_priority < b->si_priority)
+ return false;
+
+ if (a->si_weight < b->si_weight)
+ return true;
+ return false;
+}
+
+/**
+ * Insert a srvinfo element into a list
+ *
+ * @param head pointer to head of list of elements
+ * @param entry new list element to insert
+ *
+ */
+static void
+insert_srvinfo(struct srvinfo **head, struct srvinfo *entry)
+{
+ entry->si_next = *head;
+ *head = entry;
+}
+
+/**
+ * Insert a srvinfo element into a list, in order
+ *
+ * @param head pointer to head of list of elements
+ * @param entry new list element to insert
+ *
+ */
+static void
+insert_srvinfo_sorted(struct srvinfo **head, struct srvinfo *entry)
+{
+ struct srvinfo *spot, *back;
+
+ spot = *head;
+ back = NULL;
+ while (spot && srvinfo_is_after(spot, entry)) {
+ back = spot;
+ spot = spot->si_next;
+ }
+
+ if (spot == (*head))
+ insert_srvinfo(head, entry);
+ else {
+ insert_srvinfo(&spot, entry);
+ /* off the end of the list? */
+ if (spot == entry)
+ back->si_next = entry;
+ }
+}
+
+/**
+ * Retrieve list of SRV records from DNS service
+ *
+ * @param srvname NUL-terminated C string containing record type to look up
+ * @param domainname NUL-terminated C string containing domain name to look up
+ * @param si OUT: list of SRV record information retrieved
+ * @return zero on success, or an ESI_ status code describing the error
+ *
+ * Caller must free list of records using freesrvinfo().
+ */
+int
+getsrvinfo(const char *srvname, const char *domainname, struct srvinfo **si)
+{
+ unsigned char *msg, *eom, *comp_dn;
+ struct srvinfo *results;
+ unsigned short count, i;
+ int status, len;
+ char *exp_dn;
+ HEADER *hdr;
+
+ msg = calloc(1, NS_MAXMSG);
+ exp_dn = calloc(1, NS_MAXDNAME);
+ if (msg == NULL || exp_dn == NULL) {
+ status = ESI_MEMORY;
+ goto out;
+ }
+
+ _res.options |= RES_AAONLY;
+ len = res_querydomain(srvname, domainname, C_IN, T_SRV, msg, NS_MAXMSG);
+ if (len == -1) {
+ switch (h_errno) {
+ case HOST_NOT_FOUND:
+ status = ESI_NONAME;
+ break;
+ case TRY_AGAIN:
+ status = ESI_AGAIN;
+ break;
+ case NO_RECOVERY:
+ status = ESI_FAIL;
+ break;
+ case NO_DATA:
+ status = ESI_NODATA;
+ break;
+ default:
+ fprintf(stderr, "SRV query failed for %s.%s: %s\n",
+ srvname, domainname, hstrerror(h_errno));
+ status = ESI_FAIL;
+ }
+ goto out;
+ }
+
+ hdr = (HEADER *)msg;
+ count = ntohs(hdr->ancount);
+ if (count == 0) {
+ status = ESI_NODATA;
+ goto out;
+ }
+ eom = msg + len;
+
+ comp_dn = &msg[HFIXEDSZ];
+ comp_dn += dn_skipname(comp_dn, eom) + QFIXEDSZ;
+
+ results = NULL;
+ for (i = 0; i < count; i++) {
+ struct srvinfo *new;
+ struct srv *record;
+ int l;
+
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
+ if (l == -1) {
+ status = ESI_PARSE;
+ goto out_free;
+ }
+ comp_dn += l;
+
+ record = (struct srv *)&comp_dn[10];
+ comp_dn += 16;
+
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
+ if (l == -1) {
+ status = ESI_PARSE;
+ goto out_free;
+ }
+ comp_dn += l;
+
+ if (count == 1 && strcmp(exp_dn, ".") == 0) {
+ status = ESI_SERVICE;
+ goto out_free;
+ }
+
+ new = calloc(1, sizeof(*new));
+ if (new == NULL) {
+ status = ESI_MEMORY;
+ goto out;
+ }
+
+ new->si_target = strdup(exp_dn);
+ if (new->si_target == NULL) {
+ free(new);
+ status = ESI_MEMORY;
+ goto out;
+ }
+ new->si_priority = ntohs(record->priority);
+ new->si_weight = ntohs(record->weight);
+ new->si_port = ntohs(record->port);
+
+ insert_srvinfo_sorted(&results, new);
+ }
+
+ status = ESI_SUCCESS;
+ *si = results;
+
+out:
+ free(exp_dn);
+ free(msg);
+ return status;
+
+out_free:
+ freesrvinfo(results);
+ goto out;
+}
diff --git a/fedfs/fedfs-getsrvinfo.h b/fedfs/fedfs-getsrvinfo.h
new file mode 100644
index 00000000..13170359
--- /dev/null
+++ b/fedfs/fedfs-getsrvinfo.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _FEDFS_GETSRVINFO_H_
+#define _FEDFS_GETSRVINFO_H_
+
+/**
+ * Single list element containing SRV record data
+ */
+struct srvinfo {
+ struct srvinfo *si_next;
+ char *si_target;
+ unsigned short si_priority;
+ unsigned short si_weight;
+ unsigned short si_port;
+};
+
+enum {
+ ESI_SUCCESS = 0,
+ ESI_NONAME = -2,
+ ESI_AGAIN = -3,
+ ESI_FAIL = -4,
+ ESI_NODATA = -5,
+ ESI_SERVICE = -8,
+ ESI_MEMORY = -10,
+ ESI_SYSTEM = -11,
+ ESI_PARSE = -1000,
+};
+
+int getsrvinfo(const char *srvname, const char *domainname,
+ struct srvinfo **si);
+void freesrvinfo(struct srvinfo *si);
+const char *gsi_strerror(int status);
+
+#endif /* !_FEDFS_GETSRVINFO_H_ */

View File

@ -0,0 +1,342 @@
autofs-5.1.4 - add fedfs-map-nfs4.c
From: Ian Kent <raven@themaw.net>
Add build (and install) of the fedfs program map, fedfs-map-nfs4.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
autofs.spec | 1
fedfs/Makefile | 12 ++-
fedfs/fedfs-map-nfs4.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++
fedfs/fedfs-token.h | 40 +++++++++
5 files changed, 256 insertions(+), 2 deletions(-)
create mode 100644 fedfs/fedfs-map-nfs4.c
create mode 100644 fedfs/fedfs-token.h
diff --git a/CHANGELOG b/CHANGELOG
index 88992147..412e3382 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -16,6 +16,7 @@ xx/xx/2018 autofs-5.1.5
- fix libresolv configure check.
- add fedfs-getsrvinfo.c.
- add mount.fedfs.c.
+- add fedfs-map-nfs4.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/autofs.spec b/autofs.spec
index 2cc0e38f..157c09b4 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -192,6 +192,7 @@ fi
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
%{_sbindir}/mount.fedfs
+%{_sbindir}/fedfs-map-nfs4
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/fedfs/Makefile b/fedfs/Makefile
index cb325bed..dff749e4 100644
--- a/fedfs/Makefile
+++ b/fedfs/Makefile
@@ -6,11 +6,13 @@
include ../Makefile.rules
SRCS = mount.fedfs.c
-HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h \
+ fedfs-token.h
fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
mount_fedfs_OBJ = mount.fedfs.o
+fedfs-map-nfs4_OBJ = fedfs-map-nfs4.o
version := $(shell cat ../.version)
@@ -18,18 +20,24 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
CFLAGS += -DVERSION_STRING=\"$(version)\"
LDFLAGS += -rdynamic
-all: mount.fedfs
+all: mount.fedfs fedfs-map-nfs4
mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
$(CC) -o mount.fedfs \
$(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
$(LDFLAGS) $(LIBRESOLV) $(LIBS)
+fedfs-map-nfs4: $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
+ $(CC) -o fedfs-map-nfs4 \
+ $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) \
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
+
clean:
rm -f *.o *.s *~ mount.fedfs
install: all
install -d -m 755 $(INSTALLROOT)$(sbindir)
+ install -c fedfs-map-nfs4 -m 755 $(INSTALLROOT)$(sbindir); \
if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
then \
install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
diff --git a/fedfs/fedfs-map-nfs4.c b/fedfs/fedfs-map-nfs4.c
new file mode 100644
index 00000000..9f831cd7
--- /dev/null
+++ b/fedfs/fedfs-map-nfs4.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <libgen.h>
+#include <errno.h>
+#include <getopt.h>
+#include <locale.h>
+#include <netdb.h>
+#include <langinfo.h>
+
+#include "fedfs-nls.h"
+#include "fedfs-token.h"
+#include "fedfs-getsrvinfo.h"
+#include "fedfs-gpl-boiler.h"
+
+/**
+ * Name of SRV record containing NFSv4 FedFS root
+ */
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
+
+/**
+ * Export pathname of NFSv4 FedFS root
+ */
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
+
+static char *progname;
+
+/**
+ * Display usage message
+ */
+static void
+fedfs_map_usage(void)
+{
+ printf(_("\nUsage: %s [domain]\n\n"), progname);
+
+ printf("%s", fedfs_gpl_boilerplate);
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname" with one server
+ *
+ * @param si single-entry list of SRV records
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname)
+{
+ printf("-fstype=nfs,vers=4,fg");
+ if (si->si_port != 2049)
+ printf(",port=%u", si->si_port);
+ printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname);
+ return 0;
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname" with multiple servers
+ *
+ * @param si list of SRV records for requested FedFS domain
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname)
+{
+ struct srvinfo *cur;
+ unsigned short port;
+ _Bool comma;
+
+ /*
+ * Unfortunately our automounter can't handle a list of
+ * replicas where the various servers live on different
+ * ports from one another.
+ */
+ port = si->si_port;
+ for (cur = si; cur != NULL; cur = cur->si_next)
+ if (cur->si_port != port) {
+ fprintf(stderr, _("%s: Replicas on different ports not supported\n"),
+ progname);
+ return 1;
+ }
+
+ if (port != 2049)
+ printf("-fstype=nfs,vers=4,fg,port=%u ", port);
+ else
+ printf("-fstype=nfs,vers=4,fg ");
+
+ /*
+ * Note that the export path is required to be indentical
+ * for all domain root servers for this domain.
+ */
+ for (comma = false, cur = si; cur != NULL; cur = cur->si_next) {
+ if (comma)
+ printf(",");
+ printf("%s(%u)", cur->si_target, cur->si_weight);
+ comma = true;
+ }
+ printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname);
+
+ return 0;
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname"
+ *
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4(const char *domainname)
+{
+ struct srvinfo *cur, *si = NULL;
+ unsigned int count;
+ int error, result;
+
+ result = 1;
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
+ switch (error) {
+ case ESI_SUCCESS:
+ break;
+ case ESI_NONAME:
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
+ progname, domainname);
+ goto out;
+ case ESI_SERVICE:
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
+ progname, domainname);
+ goto out;
+ default:
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
+ progname, domainname, gsi_strerror(error));
+ goto out;
+ }
+
+ for (count = 0, cur = si; cur != NULL; cur = cur->si_next)
+ count++;
+ if (count == 1)
+ result = fedfs_map_nfs4_oneserver(si, domainname);
+ else
+ result = fedfs_map_nfs4_replicas(si, domainname);
+
+out:
+ freesrvinfo(si);
+ return result;
+}
+
+/**
+ * Program entry point
+ *
+ * @param argc count of command line arguments
+ * @param argv array of NUL-terminated C strings containing command line arguments
+ * @return program exit status
+ */
+int main(int argc, char *argv[])
+{
+ (void)setlocale(LC_ALL, "");
+
+ progname = basename(argv[0]);
+
+ if (argc != 2) {
+ fedfs_map_usage();
+ return 1;
+ }
+
+ if (strcmp(progname, "fedfs-map-nfs4") == 0)
+ return fedfs_map_nfs4(argv[1]);
+#ifdef EXAMPLE
+ /* CIFS support might plug in here */
+ else if (strcmp(progname, "fedfs-map-cifs") == 0)
+ return fedfs_map_cifs(argv[1]);
+#endif
+
+ fprintf(stderr, _("%s: Unsupported file system type\n"), progname);
+ return 1;
+}
diff --git a/fedfs/fedfs-token.h b/fedfs/fedfs-token.h
new file mode 100644
index 00000000..5651409d
--- /dev/null
+++ b/fedfs/fedfs-token.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2007 Oracle. All rights reserved.
+ * Copyright (C) 2007 Chuck Lever <chuck.lever@oracle.com>
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _FEDFS_UTILS_TOKEN_H
+#define _FEDFS_UTILS_TOKEN_H
+
+#include <sys/cdefs.h>
+
+/**
+ * Private tokenizer state object
+ */
+struct tokenizer;
+
+__attribute_malloc__
+struct tokenizer *tk_new_tokenizer(const char *string,
+ const char delimiter);
+__attribute_malloc__
+char *tk_next_token(struct tokenizer *state);
+void tk_free_tokenizer(struct tokenizer *state);
+int tk_tokenizer_error(const struct tokenizer *state);
+
+#endif /* !_FEDFS_UTILS_TOKEN_H */

View File

@ -0,0 +1,40 @@
autofs-5.1.4 - add-man page note about extra slashes in paths
From: Ian Kent <raven@themaw.net>
Make note of the effect unnecessary multiple slashes can have in map
paths in auto.master(5).
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
man/auto.master.5.in | 8 ++++++++
2 files changed, 9 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -25,6 +25,7 @@ xx/xx/2018 autofs-5.1.5
- use systemd sd_notify() at startup.
- fix NFS version mask usage.
- fix fd leak in rpc_do_create_client().
+- add-man page note about extra slashes in paths.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/man/auto.master.5.in
+++ autofs-5.1.4/man/auto.master.5.in
@@ -66,6 +66,14 @@ will process the map according to the sp
map entries. Indirect map entries must be unique in the master map so
second and subsequent entries for an indirect mount point are ignored by
.BR automount (8).
+.TP
+.B NOTE:
+autofs currently does not collapse multiple slashes in paths, so it is
+important to ensure paths used in maps are correct. If unnecessary multiple
+slashes are present in a path it can lead to unexpected failures such as
+an inability to expire automounts. An exception to this is a trailing slash
+at the end of the automount point path in the master map which will be
+removed if present.
.SH "FORMAT"
Master map entries have three fields separated by an arbitrary number
of spaces or tabs. Lines beginning with # are comments. The first field

View File

@ -0,0 +1,179 @@
autofs-5.1.4 - add master map pseudo options for mount propagation
From: Ian Kent <raven@themaw.net>
Add master map entry pseudo mount option of "slave" or "private" to
allow mount propagation of bind mounts to be set to either "slave" or
"private".
This option may be needed when using multi-mounts that have bind mounts
that bind to a file system that is propagation shared. This is becuase
the bind mount will have the same properties as its target which causes
problems for offset mounts. When this happens an unwanted offset mount
is propagated back to the target file system resulting in a deadlock
when attempting to access the offset.
By default bind mounts will inherit the mount propagation of the target
file system.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/automount.h | 4 ++++
lib/master_parse.y | 13 +++++++++++++
lib/master_tok.l | 2 ++
man/auto.master.5.in | 12 ++++++++++++
modules/mount_bind.c | 30 +++++++++++++++++++-----------
6 files changed, 51 insertions(+), 11 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -31,6 +31,7 @@ xx/xx/2018 autofs-5.1.5
- fix update_negative_cache() map source usage.
- mark removed cache entry negative.
- set bind mount as propagation slave.
+- add master map pseudo options for mount propagation.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -549,6 +549,10 @@ struct kernel_mod_version {
/* Read amd map even if it's not to be ghosted (browsable) */
#define MOUNT_FLAG_AMD_CACHE_ALL 0x0080
+/* Set mount propagation for bind mounts */
+#define MOUNT_FLAG_SLAVE 0x0100
+#define MOUNT_FLAG_PRIVATE 0x0200
+
struct autofs_point {
pthread_t thid;
char *path; /* Mount point name */
--- autofs-5.1.4.orig/lib/master_parse.y
+++ autofs-5.1.4/lib/master_parse.y
@@ -58,6 +58,8 @@ static char *format;
static long timeout;
static long negative_timeout;
static unsigned symlnk;
+static unsigned slave;
+static unsigned private;
static unsigned nobind;
static unsigned ghost;
extern unsigned global_selection_options;
@@ -103,6 +105,7 @@ static int master_fprintf(FILE *, char *
%token MAP
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE
+%token OPT_SLAVE OPT_PRIVATE
%token COLON COMMA NL DDASH
%type <strtype> map
%type <strtype> options
@@ -196,6 +199,8 @@ line:
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
+ | PATH OPT_SLAVE { master_notify($1); YYABORT; }
+ | PATH OPT_PRIVATE { master_notify($1); YYABORT; }
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
| PATH OPT_GHOST { master_notify($1); YYABORT; }
| PATH OPT_NOGHOST { master_notify($1); YYABORT; }
@@ -600,6 +605,8 @@ option: daemon_option
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
| OPT_SYMLINK { symlnk = 1; }
+ | OPT_SLAVE { slave = 1; }
+ | OPT_PRIVATE { private = 1; }
| OPT_NOBIND { nobind = 1; }
| OPT_NOGHOST { ghost = 0; }
| OPT_GHOST { ghost = 1; }
@@ -672,6 +679,8 @@ static void local_init_vars(void)
timeout = -1;
negative_timeout = 0;
symlnk = 0;
+ slave = 0;
+ private = 0;
nobind = 0;
ghost = defaults_get_browse_mode();
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT;
@@ -878,6 +887,10 @@ int master_parse_entry(const char *buffe
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY;
if (symlnk)
entry->ap->flags |= MOUNT_FLAG_SYMLINK;
+ if (slave)
+ entry->ap->flags |= MOUNT_FLAG_SLAVE;
+ if (private)
+ entry->ap->flags |= MOUNT_FLAG_PRIVATE;
if (negative_timeout)
entry->ap->negative_timeout = negative_timeout;
if (mode && mode < LONG_MAX)
--- autofs-5.1.4.orig/lib/master_tok.l
+++ autofs-5.1.4/lib/master_tok.l
@@ -389,6 +389,8 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTW
-?symlink { return(OPT_SYMLINK); }
-?nobind { return(OPT_NOBIND); }
-?nobrowse { return(OPT_NOGHOST); }
+ -?slave { return(OPT_SLAVE); }
+ -?private { return(OPT_PRIVATE); }
-g|--ghost|-?browse { return(OPT_GHOST); }
-v|--verbose { return(OPT_VERBOSE); }
-d|--debug { return(OPT_DEBUG); }
--- autofs-5.1.4.orig/man/auto.master.5.in
+++ autofs-5.1.4/man/auto.master.5.in
@@ -199,6 +199,18 @@ entries only, either in the master map (
or with individual map entries. The option is ignored for direct mounts
and non-root offest mount entries.
.TP
+.I slave \fPor\fI private
+This option allows mount propagation of bind mounts to be set to
+either \fIslave\fP or \fIprivate\fP. This option may be needed when using
+multi-mounts that have bind mounts that bind to a file system that is
+propagation shared. This is becuase the bind mount will have the same
+properties as its target which causes problems for offset mounts. When
+this happens an unwanted offset mount is propagated back to the target
+file system resulting in a deadlock when attempting to access the offset.
+This option is a an autofs pseudo mount option that can be used in the
+master map only. By default bind mounts will inherit the mount propagation
+of the target file system.
+.TP
.I "\-r, \-\-random-multimount-selection"
Enables the use of random selection when choosing a host from a
list of replicated servers. This option is applied to this mount
--- autofs-5.1.4.orig/modules/mount_bind.c
+++ autofs-5.1.4/modules/mount_bind.c
@@ -186,17 +186,25 @@ int mount_mount(struct autofs_point *ap,
what, fstype, fullpath);
}
- /* The bind mount has succeeded but if the target
- * mount is propagation shared propagation of child
- * mounts (autofs offset mounts for example) back to
- * the target of the bind mount must be avoided or
- * autofs trigger mounts will deadlock.
- */
- err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
- if (err)
- warn(ap->logopt,
- "failed to set propagation type for %s",
- fullpath);
+ if (ap->flags & (MOUNT_FLAG_SLAVE | MOUNT_FLAG_PRIVATE)) {
+ int flags = MS_SLAVE;
+
+ if (ap->flags & MOUNT_FLAG_PRIVATE)
+ flags = MS_PRIVATE;
+
+ /* The bind mount has succeeded but if the target
+ * mount is propagation shared propagation of child
+ * mounts (autofs offset mounts for example) back to
+ * the target of the bind mount must be avoided or
+ * autofs trigger mounts will deadlock.
+ */
+ err = mount(NULL, fullpath, NULL, flags, NULL);
+ if (err) {
+ warn(ap->logopt,
+ "failed to set propagation for %s",
+ fullpath, root);
+ }
+ }
return 0;
} else {

View File

@ -0,0 +1,696 @@
autofs-5.1.4 - add mount.fedfs.c
From: Ian Kent <raven@themaw.net>
Add build and install of the mount.fedfs binary.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
Makefile | 3
Makefile.rules | 2
autofs.spec | 1
fedfs/Makefile | 36 +++
fedfs/fedfs-gpl-boiler.h | 40 ++++
fedfs/fedfs-nls.h | 38 ++++
fedfs/mount.fedfs.c | 485 ++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 605 insertions(+), 1 deletion(-)
create mode 100644 fedfs/Makefile
create mode 100644 fedfs/fedfs-gpl-boiler.h
create mode 100644 fedfs/fedfs-nls.h
create mode 100644 fedfs/mount.fedfs.c
diff --git a/CHANGELOG b/CHANGELOG
index 8d6c737c..88992147 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -15,6 +15,7 @@ xx/xx/2018 autofs-5.1.5
- dont allow trailing slash in master map mount points.
- fix libresolv configure check.
- add fedfs-getsrvinfo.c.
+- add mount.fedfs.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile b/Makefile
index e560a7cb..99db2c75 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,9 @@ kernel:
samples:
set -e; if [ -d samples ]; then $(MAKE) -C samples all; fi
+fedfs:
+ set -e; if [ -d fedfs ]; then $(MAKE) -C fedfs all; fi
+
clean:
for i in $(SUBDIRS) samples; do \
if [ -d $$i ]; then $(MAKE) -C $$i clean; fi; done
diff --git a/Makefile.rules b/Makefile.rules
index 4deab3b9..fc9f6019 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,7 +3,7 @@
#
# Root directory contents
-SUBDIRS = lib daemon modules man
+SUBDIRS = lib daemon fedfs modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
diff --git a/autofs.spec b/autofs.spec
index 2464e741..2cc0e38f 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -191,6 +191,7 @@ fi
%config(noreplace) /etc/sysconfig/autofs
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
+%{_sbindir}/mount.fedfs
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/fedfs/Makefile b/fedfs/Makefile
new file mode 100644
index 00000000..cb325bed
--- /dev/null
+++ b/fedfs/Makefile
@@ -0,0 +1,36 @@
+#
+# Makefile for mount.fedfs
+#
+
+-include ../Makefile.conf
+include ../Makefile.rules
+
+SRCS = mount.fedfs.c
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
+
+fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
+
+mount_fedfs_OBJ = mount.fedfs.o
+
+version := $(shell cat ../.version)
+
+CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
+CFLAGS += -DVERSION_STRING=\"$(version)\"
+LDFLAGS += -rdynamic
+
+all: mount.fedfs
+
+mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
+ $(CC) -o mount.fedfs \
+ $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
+
+clean:
+ rm -f *.o *.s *~ mount.fedfs
+
+install: all
+ install -d -m 755 $(INSTALLROOT)$(sbindir)
+ if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
+ then \
+ install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
+ fi
diff --git a/fedfs/fedfs-gpl-boiler.h b/fedfs/fedfs-gpl-boiler.h
new file mode 100644
index 00000000..1353e736
--- /dev/null
+++ b/fedfs/fedfs-gpl-boiler.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _GPL_BOILER_H_
+#define _GPL_BOILER_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/**
+ * GPLv2 boilerplate for usage messages
+ */
+static const char *fedfs_gpl_boilerplate =
+ "\nCopyright 2010, 2011, 2012, 2013 Oracle. "
+ "All rights reserved.\n\n"
+ "License GPLv2: "
+ "<http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>\n"
+ "This is free software. "
+ "You are free to change and redistribute it.\n"
+ "There is NO WARRANTY, to the extent permitted by law.\n";
+
+#endif /* !_GPL_BOILER_H_ */
diff --git a/fedfs/fedfs-nls.h b/fedfs/fedfs-nls.h
new file mode 100644
index 00000000..92f968d3
--- /dev/null
+++ b/fedfs/fedfs-nls.h
@@ -0,0 +1,38 @@
+/*
+ * From util-linux/include/nls.h (GPLv2)
+ */
+
+#ifndef UTIL_LINUX_NLS_H
+#define UTIL_LINUX_NLS_H
+
+int main(int argc, char *argv[]);
+
+#ifndef LOCALEDIR
+#define LOCALEDIR "/usr/share/locale"
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#else
+# undef setlocale
+# define setlocale(Category, Locale) ({}) /* empty */
+#endif
+
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# define _(Text) gettext (Text)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# undef bindtextdomain
+# define bindtextdomain(Domain, Directory) /* empty */
+# undef textdomain
+# define textdomain(Domain) /* empty */
+# define _(Text) (Text)
+# define N_(Text) (Text)
+#endif
+
+#endif /* UTIL_LINUX_NLS_H */
diff --git a/fedfs/mount.fedfs.c b/fedfs/mount.fedfs.c
new file mode 100644
index 00000000..bd434395
--- /dev/null
+++ b/fedfs/mount.fedfs.c
@@ -0,0 +1,485 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <libgen.h>
+#include <errno.h>
+#include <getopt.h>
+#include <locale.h>
+#include <netdb.h>
+#include <langinfo.h>
+
+#include "fedfs-nls.h"
+#include "fedfs-getsrvinfo.h"
+#include "fedfs-gpl-boiler.h"
+
+/**
+ * Top-level directory on client under which we mount NFSv4 domain roots
+ */
+#define FEDFS_NFS4_TLDIR "nfs4"
+
+/**
+ * Name of SRV record containing NFSv4 FedFS root
+ */
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
+
+/**
+ * Export path of NFSv4 FedFS root
+ */
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
+
+/**
+ * Pathname to mount.nfs
+ */
+#define MOUNT_NFS_EXECUTABLE "/sbin/mount.nfs"
+
+/**
+ * Mount status values, lifted from util-linux
+ */
+enum {
+ EX_SUCCESS = 0,
+ EX_USAGE = 1,
+ EX_FAIL = 32,
+};
+
+static char *progname;
+static int nomtab;
+static int verbose;
+static _Bool readonly;
+static _Bool sloppy;
+static _Bool fake;
+
+/**
+ * Short form command line options
+ */
+static const char fedfs_opts[] = "fhno:rsvVw";
+
+/**
+ * Long form command line options
+ */
+static const struct option fedfs_longopts[] =
+{
+ { "fake", 0, NULL, 'f' },
+ { "help", 0, NULL, 'h' },
+ { "no-mtab", 0, NULL, 'n' },
+ { "options", 1, NULL, 'o' },
+ { "read-only", 0, NULL, 'r' },
+ { "read-write", 0, NULL, 'w' },
+ { "ro", 0, NULL, 'r' },
+ { "rw", 0, NULL, 'w' },
+ { "sloppy", 0, NULL, 's' },
+ { "verbose", 0, NULL, 'v' },
+ { "version", 0, NULL, 'V' },
+ { NULL, 0, NULL, 0 }
+};
+
+/**
+ * Display mount.fedfs usage message
+ */
+static void
+mount_usage(void)
+{
+ printf(_("\nUsage: %s remotedir localdir [-fhnrsvVw]\n\n"), progname);
+ printf(_("options:\n"));
+ printf(_("\t-f\t\tFake mount, do not actually mount\n"));
+ printf(_("\t-h\t\tPrint this help\n"));
+ printf(_("\t-n\t\tDo not update /etc/mtab\n"));
+ printf(_("\t-r\t\tMount file system readonly\n"));
+ printf(_("\t-s\t\tTolerate sloppy mount options\n"));
+ printf(_("\t-v\t\tVerbose\n"));
+ printf(_("\t-V\t\tPrint version\n"));
+ printf(_("\t-w\t\tMount file system read-write\n"));
+
+ printf("%s", fedfs_gpl_boilerplate);
+}
+
+/**
+ * Concatenate three strings
+ *
+ * @param s NUL-terminated C string
+ * @param t NUL-terminated C string
+ * @param u NUL-terminated C string
+ * @return pointer to NUL-terminated C string or NULL
+ *
+ * Caller must free the returned string with free(3). Always frees
+ * its first arg - typical use: s = xstrconcat3(s,t,u);
+ *
+ * Lifted from util-linux.
+ */
+static char *
+xstrconcat3(char *s, const char *t, const char *u)
+{
+ _Bool free_s = true;
+ char *result;
+
+ if (s == NULL) {
+ s = "";
+ free_s = false;
+ }
+ if (t == NULL)
+ t = "";
+ if (u == NULL)
+ u = "";
+ result = malloc(strlen(s) + strlen(t) + strlen(u) + 1);
+ if (result == NULL)
+ goto out;
+
+ strcpy(result, s);
+ strcat(result, t);
+ strcat(result, u);
+
+out:
+ if (free_s)
+ free(s);
+ return result;
+}
+
+/**
+ * Exec mount.nfs
+ *
+ * @param server NUL-terminated C string containing name of NFS server
+ * @param port server port to use when mounting
+ * @param domainname NUL-terminated C string containing FedFS domain name
+ * @param export_path NUL-terminated C string containing server export path
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ *
+ */
+static void
+exec_mount_nfs4(const char *server, unsigned short port,
+ const char *domainname, const char *export_path,
+ const char *mounted_on_dir, const char *text_options)
+{
+ static char special[2048];
+ static char options[2048];
+ char *args[16];
+ int count = 0;
+
+ snprintf(special, sizeof(special), "%s:%s/%s%s", server,
+ FEDFS_NFS_EXPORTPATH, domainname, export_path);
+
+ if (text_options != NULL && strcmp(text_options, "") != 0)
+ snprintf(options, sizeof(options), "%s,vers=4,fg,port=%u",
+ text_options, port);
+ else
+ snprintf(options, sizeof(options), "vers=4,fg,port=%u", port);
+
+ if (verbose) {
+ printf(_("%s: Special device: %s\n"),
+ progname, special);
+ printf(_("%s: Mounted-on directory: %s\n"),
+ progname, mounted_on_dir);
+ printf(_("%s: Mount options: %s\n"),
+ progname, options);
+ }
+
+ args[count++] = MOUNT_NFS_EXECUTABLE;
+ args[count++] = special;
+ args[count++] = (char *)mounted_on_dir;
+ if (verbose)
+ args[count++] = "-v";
+ if (fake)
+ args[count++] = "-f";
+ if (nomtab)
+ args[count++] = "-n";
+ if (readonly)
+ args[count++] = "-r";
+ if (sloppy)
+ args[count++] = "-s";
+ args[count++] = "-o";
+ args[count++] = options;
+
+ args[count] = NULL;
+ execv(args[0], args);
+}
+
+/**
+ * Mount a FedFS domain root via NFSv4
+ *
+ * @param domainname NUL-terminated C string containing FedFS domain name
+ * @param export_path NUL-terminated C string containing server export path
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ * @return exit status code from the mount.nfs command
+ *
+ * Construct the server:/export string and the mounted-on directory string
+ * based on the DNS SRV query results, then fork and exec mount.nfs to do
+ * the actual mount request.
+ */
+static int
+nfs4_mount(const char *domainname, const char *export_path,
+ const char *mounted_on_dir, const char *text_options)
+{
+ struct srvinfo *tmp, *si = NULL;
+ int error, status;
+
+ status = EX_FAIL;
+
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
+ switch (error) {
+ case ESI_SUCCESS:
+ break;
+ case ESI_NONAME:
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
+ progname, domainname);
+ goto out;
+ case ESI_SERVICE:
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
+ progname, domainname);
+ goto out;
+ default:
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
+ progname, domainname, gsi_strerror(error));
+ goto out;
+ }
+
+ /*
+ * The srvinfo list is already in RFC 2782 sorted order. Try each
+ * SRV record once, in the foreground. Go with the first one that
+ * works.
+ */
+ for (tmp = si; tmp != NULL; tmp = tmp->si_next) {
+ pid_t pid;
+
+ pid = fork();
+ switch (pid) {
+ case 0:
+ exec_mount_nfs4(tmp->si_target, tmp->si_port,
+ domainname, export_path, mounted_on_dir,
+ text_options);
+ /*NOTREACHED*/
+ fprintf(stderr, _("%s: Failed to exec: %s\n"),
+ progname, strerror(errno));
+ exit(EX_FAIL);
+ case -1:
+ fprintf(stderr, _("%s: Failed to fork: %s\n"),
+ progname, strerror(errno));
+ goto out;
+ default:
+ waitpid(pid, &status, 0);
+ if (status == EX_SUCCESS)
+ goto out;
+ }
+ }
+
+out:
+ freesrvinfo(si);
+ return status;
+}
+
+/**
+ * Try one mount request
+ *
+ * @param source NUL-terminated C string containing name of "special device"
+ * @param target NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ * @return an exit status code
+ *
+ * Parse the pathname in "source." It contains the file system protocol
+ * and FedFS domain name. Then pass these arguments to the appropriate
+ * mount helper subcommand.
+ */
+static int
+try_mount(const char *source, const char *target, const char *text_options)
+{
+ char *global_name, *topdir, *domainname, *remaining;
+ int result;
+
+ remaining = NULL;
+ result = EX_FAIL;
+
+ global_name = strdup(source);
+ if (global_name == NULL) {
+ fprintf(stderr, _("%s: Unable to parse globally useful name\n"),
+ progname);
+ goto out;
+ }
+
+ topdir = strtok(global_name, "/");
+ if (topdir == NULL) {
+ fprintf(stderr, _("%s: Invalid globally useful name: %s\n"),
+ progname, source);
+ goto out;
+ }
+ if (verbose)
+ printf(_("%s: Top-level directory: %s\n"),
+ progname, topdir);
+
+ domainname = strtok(NULL, "/");
+ if (domainname == NULL) {
+ fprintf(stderr, _("%s: Missing domain name in globally "
+ "useful name: %s\n"), progname, source);
+ goto out;
+ }
+ if (verbose)
+ printf(_("%s: Domain name: %s\n"),
+ progname, domainname);
+
+ remaining = strtok(NULL, "/");
+ if (remaining == NULL) {
+ remaining = strdup("/");
+ if (remaining == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ goto out;
+ }
+ } else {
+ char *tmp;
+
+ tmp = malloc(strlen(remaining) + 1);
+ if (tmp == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ remaining = NULL;
+ goto out;
+ }
+ strcpy(tmp, "/");
+ strcat(tmp, remaining);
+ remaining = tmp;
+ }
+ if (verbose)
+ printf(_("%s: Export path: %s\n"),
+ progname, remaining);
+
+ if (strcmp(topdir, FEDFS_NFS4_TLDIR) == 0)
+ result = nfs4_mount(domainname, remaining, target, text_options);
+#if 0
+ /* example: SMB support plugs in here */
+ else if (strcmp(topdir, FEDFS_SMB_TLDIR) == 0)
+ result = smb_mount(domainname, remaining, target, text_options);
+#endif
+ else
+ fprintf(stderr, _("%s: Unrecognized file system protocol\n"), progname);
+
+out:
+ free(global_name);
+ free(remaining);
+
+ return result;
+}
+
+/**
+ * Program entry point
+ *
+ * @param argc count of command line arguments
+ * @param argv array of NUL-terminated C strings containing command line arguments
+ * @return program exit status
+ */
+int main(int argc, char *argv[])
+{
+ char *source, *target, *text_options;
+ int c, mnt_err;
+
+ (void)setlocale(LC_ALL, "");
+
+ progname = basename(argv[0]);
+
+ if (argv[1] && argv[1][0] == '-') {
+ if(argv[1][1] == 'V')
+ printf("%s (VERSION_STRING)\n", progname);
+ else
+ mount_usage();
+ exit(EX_SUCCESS);
+ }
+
+ if (argc < 3) {
+ mount_usage();
+ exit(EX_USAGE);
+ }
+
+ source = argv[1];
+ target = argv[2];
+
+ mnt_err = EX_USAGE;
+ text_options = NULL;
+ readonly = false;
+ sloppy = false;
+ fake = false;
+ argv[2] = argv[0]; /* so that getopt error messages are correct */
+ while ((c = getopt_long(argc - 2, argv + 2, fedfs_opts,
+ fedfs_longopts, NULL)) != -1) {
+ switch (c) {
+ case 'f':
+ fake = true;
+ break;
+ case 'n':
+ ++nomtab;
+ break;
+ case 'o':
+ /* Ugh. */
+ if (text_options != NULL)
+ text_options = xstrconcat3(text_options, ",", optarg);
+ else
+ text_options = strdup(optarg);
+ if (text_options == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ goto out;
+ }
+ break;
+ case 'r':
+ readonly = true;
+ break;
+ case 's':
+ sloppy = true;
+ break;
+ case 'v':
+ ++verbose;
+ break;
+ case 'V':
+ printf("%s: (VERSION_STRING)\n", progname);
+ mnt_err = EX_SUCCESS;
+ goto out;
+ case 'w':
+ readonly = false;
+ break;
+ case 'h':
+ default:
+ mount_usage();
+ goto out;
+ }
+ }
+
+ /* Extra non-option words at the end are bogus... */
+ if (optind != argc - 2) {
+ mount_usage();
+ goto out;
+ }
+
+ if (getuid() != 0 && geteuid() != 0) {
+ fprintf(stderr, _("%s: Not installed setuid - "
+ "\"user\" FedFS mounts are not supported\n"), progname);
+ mnt_err = EX_FAIL;
+ goto out;
+ }
+
+ mnt_err = try_mount(source, target, text_options);
+
+out:
+ free(text_options);
+ exit(mnt_err);
+}

View File

@ -0,0 +1,137 @@
autofs-5.1.4 - add systemd service command line option
From: Ian Kent <raven@themaw.net>
When run as a systemd service using the systemd notification method to
synchronise startup, logging should be done to syslog so the log entry
format is consistent between daemon and systemd usage.
So, rather than run use the forground option, add an option to tell
the automounter it's being run as a systemd service and use syslog
for logging when its present on the command line.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 22 +++++++++++++++++++---
include/automount.h | 1 +
man/automount.8 | 4 ++++
samples/autofs.service.in | 2 +-
5 files changed, 26 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -43,6 +43,7 @@ xx/xx/2018 autofs-5.1.5
- update build info with systemd.
- use flags for startup boolean options.
- move close stdio descriptors to become_daemon().
+- add systemd service command line option.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1210,13 +1210,21 @@ static void become_daemon(unsigned int f
}
/* Detach from foreground process */
- if (flags & DAEMON_FLAGS_FOREGROUND) {
+ if (flags & DAEMON_FLAGS_FOREGROUND &&
+ !(flags & DAEMON_FLAGS_SYSTEMD_SERVICE)) {
if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
fprintf(stderr, "%s: program is already running.\n",
program);
exit(1);
}
log_to_stderr();
+ } else if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE) {
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
+ fprintf(stderr, "%s: program is already running.\n",
+ program);
+ exit(1);
+ }
+ open_log();
} else {
int nullfd;
@@ -1925,6 +1933,8 @@ static void usage(void)
" -d --debug log debuging info\n"
" -Dvariable=value, --define variable=value\n"
" define global macro variable\n"
+ " -S --systemd-service\n"
+ " run automounter as a systemd service\n"
" -f --foreground do not fork into background\n"
" -r --random-multimount-selection\n"
" use ramdom replicated server selection\n"
@@ -2190,7 +2200,7 @@ int main(int argc, char *argv[])
time_t timeout;
time_t age = monotonic_time(NULL);
struct rlimit rlim;
- const char *options = "+hp:t:vmdD:fVrO:l:n:CFM";
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
static const struct option long_options[] = {
{"help", 0, 0, 'h'},
{"pid-file", 1, 0, 'p'},
@@ -2198,6 +2208,7 @@ int main(int argc, char *argv[])
{"verbose", 0, 0, 'v'},
{"debug", 0, 0, 'd'},
{"define", 1, 0, 'D'},
+ {"systemd-service", 0, 0, 'S'},
{"foreground", 0, 0, 'f'},
{"random-multimount-selection", 0, 0, 'r'},
{"negative-timeout", 1, 0, 'n'},
@@ -2266,6 +2277,10 @@ int main(int argc, char *argv[])
macro_parse_globalvar(optarg);
break;
+ case 'S':
+ flags |= DAEMON_FLAGS_SYSTEMD_SERVICE;
+ break;
+
case 'f':
flags |= DAEMON_FLAGS_FOREGROUND;
break;
@@ -2653,7 +2668,8 @@ int main(int argc, char *argv[])
}
#ifdef WITH_SYSTEMD
- sd_notify(1, "READY=1");
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
+ sd_notify(1, "READY=1");
#endif
state_mach_thid = pthread_self();
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -67,6 +67,7 @@
#endif
#define DAEMON_FLAGS_FOREGROUND 0x0001
+#define DAEMON_FLAGS_SYSTEMD_SERVICE 0x0002
#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
#define DAEMON_FLAGS_GHOST 0x0008
#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
--- autofs-5.1.4.orig/man/automount.8
+++ autofs-5.1.4/man/automount.8
@@ -57,6 +57,10 @@ Define a global macro substitution varia
are over-ridden macro definitions of the same name specified in
mount entries.
.TP
+.I \-S, \-\-systemd-service
+Used when running the automounter as a systemd service to ensure log entry
+format is consistent with the log entry format when running as a daemon.
+.TP
.I "\-f, \-\-foreground"
Run the daemon in the foreground and log to stderr instead of syslog."
.TP
--- autofs-5.1.4.orig/samples/autofs.service.in
+++ autofs-5.1.4/samples/autofs.service.in
@@ -6,7 +6,7 @@ Wants=network-online.target rpc-statd.se
[Service]
Type=notify
EnvironmentFile=-@@autofsconfdir@@/autofs
-ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon
+ExecStart=@@sbindir@@/automount $OPTIONS --systemd-service --dont-check-daemon
ExecReload=/usr/bin/kill -HUP $MAINPID
KillMode=process
TimeoutSec=180

View File

@ -0,0 +1,39 @@
autofs-5.1.4 - add units After line to include statd service
From: Ian Kent <raven@themaw.net>
autofs needs to ensure statd is started before any NFS mounts
are attempted. This is because if the first NFS mount starts
the service and the mount is an automounted directory that is
included in the PATH used by systemctl (eg. /usr/local/bin)
the mount cannot complete.
Add rpc-statd.service to the unit "After=" line to try and
ensure it is started before automount.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/autofs.service.in | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -21,6 +21,7 @@ xx/xx/2018 autofs-5.1.5
- add an example fedfs master map entry to the installed master map.
- improve hostname lookup error logging.
- tiny patch for autofs typo and possible bug.
+- add units After line to include statd service.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/samples/autofs.service.in
+++ autofs-5.1.4/samples/autofs.service.in
@@ -1,6 +1,6 @@
[Unit]
Description=Automounts filesystems on demand
-After=network.target ypbind.service sssd.service network-online.target remote-fs.target
+After=network.target ypbind.service sssd.service network-online.target remote-fs.target rpc-statd.service rpcbind.service
Wants=network-online.target rpc-statd.service rpcbind.service
[Service]

View File

@ -0,0 +1,130 @@
autofs-5.1.4 - better handle hesiod support not built in
From: Ian Kent <raven@themaw.net>
The configure option --without-hesiod is not handled well.
If this option is given and hesiod is seen in the master
map parser or the amd map parser issue a message telling
the user hesiod support isn't built in.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 18 ++++++++++++++++--
modules/amd_parse.y | 7 +++++++
modules/parse_amd.c | 28 +++++++++++++++++++++++++---
4 files changed, 49 insertions(+), 5 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -36,6 +36,7 @@ xx/xx/2018 autofs-5.1.5
- fix use after free in parse_ldap_config().
- fix incorrect locking in sss lookup.
- fix amd parser opts option handling.
+- better handle hesiod support not built in.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/master_parse.y
+++ autofs-5.1.4/lib/master_parse.y
@@ -171,7 +171,14 @@ line:
if ((tmp = strchr($2, ',')))
*tmp++ = '\0';
-
+#ifndef WITH_HESIOD
+ /* Map type or or map type parser is hesiod */
+ if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
+ master_error("hesiod support not built in");
+ local_free_vars();
+ YYABORT;
+ }
+#endif
if (type)
free(type);
type = master_strdup($2);
@@ -352,7 +359,14 @@ map: PATH
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
-
+#ifndef WITH_HESIOD
+ /* Map type or or map type parser is hesiod */
+ if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
+ master_error("hesiod support not built in");
+ local_free_vars();
+ YYABORT;
+ }
+#endif
if (type)
free(type);
if (strcmp($1, "exec"))
--- autofs-5.1.4.orig/modules/amd_parse.y
+++ autofs-5.1.4/modules/amd_parse.y
@@ -574,6 +574,13 @@ static int match_map_option_map_type(cha
!strcmp(map_type, "nisplus") ||
!strcmp(map_type, "ldap") ||
!strcmp(map_type, "hesiod")) {
+#ifndef WITH_HESIOD
+ if (!strcmp(map_type, "hesiod")) {
+ amd_msg("hesiod support not built in");
+ free(map_type);
+ return 0;
+ }
+#endif
amd_set_value(&entry.map_type, map_type);
} else if (!strcmp(map_type, "exec")) {
/* autofs uses "program" for "exec" map type */
--- autofs-5.1.4.orig/modules/parse_amd.c
+++ autofs-5.1.4/modules/parse_amd.c
@@ -1871,15 +1871,25 @@ struct amd_entry *make_default_entry(str
if (amd_parse_list(ap, defaults, &dflts, &sv))
return NULL;
defaults_entry = list_entry(dflts.next, struct amd_entry, list);
- list_del_init(&defaults_entry->list);
/*
* If map type isn't given try to inherit from
* parent. A NULL map type is valid and means
* use configured nss sources.
*/
map_type = conf_amd_get_map_type(ap->path);
- if (map_type)
+ if (map_type) {
defaults_entry->map_type = map_type;
+#ifndef HAVE_HESIOD
+ if (!strcmp(map_type, "hesiod")) {
+ warn(ap->logopt, MODPREFIX
+ "hesiod support not built in, "
+ "defaults map entry not set");
+ defaults_entry = NULL;
+ }
+#endif
+ }
+ if (defaults_entry)
+ list_del_init(&defaults_entry->list);
/* The list should now be empty .... */
free_amd_entry_list(&dflts);
return defaults_entry;
@@ -2005,8 +2015,20 @@ static struct amd_entry *get_defaults_en
* use configured nss sources.
*/
char *map_type = conf_amd_get_map_type(ap->path);
- if (map_type)
+ if (map_type) {
entry->map_type = map_type;
+#ifndef HAVE_HESIOD
+ if (!strcmp(map_type, "hesiod")) {
+ warn(ap->logopt, MODPREFIX
+ "hesiod support not built in, "
+ "attempting to use internal "
+ "default");
+ free_amd_entry(entry);
+ free(expand);
+ goto out;
+ }
+#endif
+ }
}
free(expand);
}

View File

@ -0,0 +1,136 @@
autofs-5.1.4 - change expire type naming to better reflect usage
From: Ian Kent <raven@themaw.net>
Expires can request different types of expire, currently normal or
immediate (and later force).
Change the naming used in the expire functions to better indicate
usage.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 8 ++++----
daemon/indirect.c | 8 ++++----
daemon/state.c | 4 ++--
include/state.h | 2 +-
5 files changed, 12 insertions(+), 11 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -54,6 +54,7 @@ xx/xx/2018 autofs-5.1.5
- allow period following macro in selector value.
- fix macro expansion in selector values.
- also use strictexpire for offsets.
+- change expire type naming to better reflect usage.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -861,7 +861,7 @@ void *expire_proc_direct(void *arg)
struct expire_args ec;
struct autofs_point *ap;
struct mapent *me = NULL;
- unsigned int now;
+ unsigned int how;
int ioctlfd, cur_state;
int status, ret, left;
@@ -872,7 +872,7 @@ void *expire_proc_direct(void *arg)
fatal(status);
ap = ec.ap = ea->ap;
- now = ea->when;
+ how = ea->how;
ec.status = -1;
ea->signaled = 1;
@@ -966,7 +966,7 @@ void *expire_proc_direct(void *arg)
ioctlfd = me->ioctlfd;
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
if (ret) {
left++;
pthread_setcancelstate(cur_state, NULL);
@@ -992,7 +992,7 @@ void *expire_proc_direct(void *arg)
debug(ap->logopt, "send expire to trigger %s", next->path);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
if (ret)
left++;
pthread_setcancelstate(cur_state, NULL);
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -402,7 +402,7 @@ void *expire_proc_indirect(void *arg)
struct mnt_list *mnts = NULL, *next;
struct expire_args *ea;
struct expire_args ec;
- unsigned int now;
+ unsigned int how;
int offsets, submnts, count;
int retries;
int ioctlfd, cur_state;
@@ -415,7 +415,7 @@ void *expire_proc_indirect(void *arg)
fatal(status);
ap = ec.ap = ea->ap;
- now = ea->when;
+ how = ea->how;
ec.status = -1;
ea->signaled = 1;
@@ -540,7 +540,7 @@ void *expire_proc_indirect(void *arg)
debug(ap->logopt, "expire %s", next->path);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
if (ret)
left++;
pthread_setcancelstate(cur_state, NULL);
@@ -554,7 +554,7 @@ void *expire_proc_indirect(void *arg)
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
retries = (count_mounts(ap, ap->path, ap->dev) + 1);
while (retries--) {
- ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, now);
+ ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, how);
if (ret)
left++;
}
--- autofs-5.1.4.orig/daemon/state.c
+++ autofs-5.1.4/daemon/state.c
@@ -267,7 +267,7 @@ void expire_proc_cleanup(void *arg)
return;
}
-static enum expire expire_proc(struct autofs_point *ap, int now)
+static enum expire expire_proc(struct autofs_point *ap, int how)
{
pthread_t thid;
struct expire_args *ea;
@@ -295,7 +295,7 @@ static enum expire expire_proc(struct au
fatal(status);
ea->ap = ap;
- ea->when = now;
+ ea->how = how;
ea->status = 1;
if (ap->type == LKP_INDIRECT)
--- autofs-5.1.4.orig/include/state.h
+++ autofs-5.1.4/include/state.h
@@ -55,7 +55,7 @@ struct expire_args {
unsigned int signaled;
struct autofs_point *ap; /* autofs mount we are working on */
enum states state; /* State prune or expire */
- unsigned int when; /* Immediate expire ? */
+ unsigned int how; /* Normal, immediate expire ? */
int status; /* Return status */
};

View File

@ -0,0 +1,425 @@
autofs-5.1.4 - covarity fixes 1
From: Ian Kent <raven@themaw.net>
* remove conditional close of nullfd.
* fix memory leak of local_domain in lib/macros.c:macro_init().
* check for NULL prior to several assignments in lib/master_parse.y.
* fix memory leak in lib/mounts.c:add_std_amd_vars().
* add missing break in lib/rpc_subs.c:rpc_get_netid().
* fix variable scope problem in modules/amd_parse.c:make_selector().
* fix selector itself not freed in lib/parse_subs.c:free_selector().
* fix possible memory leak in modules/lookup_ldap.c:parse_ldap_config().
* fix possible memory leak in modules/lookup_ldap.c:decode_percent_hack().
* fix usage of decode_percent_hack() in modules/lookup_ldap.c.
* initialize enc_key1 and enc_key2 in modules/lookup_ldap.c:lookup_one().
* fix double alloc of map_type in modules/parse_amd.c:make_default_entry().
* fix double alloc of map_type in modules/parse_amd.c:get_defaults_entry().
* fix possible memory leak in modules/parse_sun.c:parse_reinit().
* initialize myoptions and ro_loc in modules/parse_sun.c:mount_subtree().
* initialize myoptions and loc in modules/parse_sun.c:parse_mount().
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/log.c | 3 +--
lib/macros.c | 1 +
lib/master_parse.y | 28 ++++++++++++++++++++++++++++
lib/mounts.c | 4 +++-
lib/parse_subs.c | 1 +
lib/rpc_subs.c | 1 +
modules/amd_parse.y | 4 ++--
modules/lookup_ldap.c | 27 ++++++++++++++++++++++-----
modules/parse_amd.c | 4 ++--
modules/parse_sun.c | 10 +++++++++-
11 files changed, 71 insertions(+), 13 deletions(-)
--- autofs-5.1.4.orig/lib/log.c
+++ autofs-5.1.4/lib/log.c
@@ -336,8 +336,7 @@ void log_to_syslog(void)
exit(1);
}
- if (nullfd > 2)
- close(nullfd);
+ close(nullfd);
return;
}
--- autofs-5.1.4.orig/lib/macros.c
+++ autofs-5.1.4/lib/macros.c
@@ -137,6 +137,7 @@ void macro_init(void)
macro_init_done = 1;
macro_unlock();
+ free(local_domain);
return;
}
--- autofs-5.1.4.orig/lib/master_parse.y
+++ autofs-5.1.4/lib/master_parse.y
@@ -157,6 +157,8 @@ line:
trim_maptype($2);
+ if (path)
+ free(path);
path = master_strdup($1);
if (!path) {
master_error("memory allocation error");
@@ -167,6 +169,8 @@ line:
if ((tmp = strchr($2, ',')))
*tmp++ = '\0';
+ if (type)
+ free(type);
type = master_strdup($2);
if (!type) {
master_error("memory allocation error");
@@ -174,6 +178,8 @@ line:
YYABORT;
}
if (tmp) {
+ if (format)
+ free(format);
format = master_strdup(tmp);
if (!format) {
master_error("memory allocation error");
@@ -204,6 +210,8 @@ line:
mapspec: map
{
+ if (local_argv)
+ free_argv(local_argc, (const char **) local_argv);
local_argc = tmp_argc;
local_argv = tmp_argv;
tmp_argc = 0;
@@ -211,6 +219,8 @@ mapspec: map
}
| map options
{
+ if (local_argv)
+ free_argv(local_argc, (const char **) local_argv);
local_argc = tmp_argc;
local_argv = tmp_argv;
tmp_argc = 0;
@@ -288,6 +298,8 @@ map: PATH
}
| MAPHOSTS
{
+ if (type)
+ free(type);
type = master_strdup($1 + 1);
if (!type) {
local_free_vars();
@@ -302,6 +314,8 @@ map: PATH
}
| MAPNULL
{
+ if (type)
+ free(type);
type = master_strdup($1 + 1);
if (!type) {
local_free_vars();
@@ -310,6 +324,8 @@ map: PATH
}
| dnattrs
{
+ if (type)
+ free(type);
type = master_strdup("ldap");
if (!type) {
local_free_vars();
@@ -332,6 +348,8 @@ map: PATH
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
+ if (type)
+ free(type);
if (strcmp($1, "exec"))
type = master_strdup($1);
else
@@ -342,6 +360,8 @@ map: PATH
YYABORT;
}
if (tmp) {
+ if (format)
+ free(format);
format = master_strdup(tmp);
if (!format) {
master_error("memory allocation error");
@@ -366,6 +386,8 @@ map: PATH
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
+ if (type)
+ free(type);
if (strcmp($1, "exec"))
type = master_strdup($1);
else
@@ -376,6 +398,8 @@ map: PATH
YYABORT;
}
if (tmp) {
+ if (format)
+ free(format);
format = master_strdup(tmp);
if (!format) {
master_error("memory allocation error");
@@ -400,6 +424,8 @@ map: PATH
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
+ if (type)
+ free(type);
if (strcmp($1, "exec"))
type = master_strdup($1);
else
@@ -410,6 +436,8 @@ map: PATH
YYABORT;
}
if (tmp) {
+ if (format)
+ free(format);
format = master_strdup(tmp);
if (!format) {
master_error("memory allocation error");
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -489,8 +489,10 @@ void add_std_amd_vars(struct substvar *s
const struct substvar *v = macro_findvar(sv, "domain", 4);
if (v && *v->val) {
tmp = strdup(v->val);
- if (tmp)
+ if (tmp) {
macro_global_addvar("cluster", 7, tmp);
+ free(tmp);
+ }
}
}
--- autofs-5.1.4.orig/lib/parse_subs.c
+++ autofs-5.1.4/lib/parse_subs.c
@@ -189,6 +189,7 @@ void free_selector(struct selector *sele
free(s->func.arg2);
s = next;
}
+ free(selector);
return;
}
--- autofs-5.1.4.orig/lib/rpc_subs.c
+++ autofs-5.1.4/lib/rpc_subs.c
@@ -389,6 +389,7 @@ static enum clnt_stat rpc_get_netid(cons
}
*netid = nc_netid;
+ break;
}
endnetconfig(handle);
free(nc_proto);
--- autofs-5.1.4.orig/modules/amd_parse.y
+++ autofs-5.1.4/modules/amd_parse.y
@@ -822,13 +822,13 @@ static int make_selector(char *name,
if (!value1)
tmp = NULL;
else {
- char *tmp = amd_strdup(value1);
+ tmp = amd_strdup(value1);
if (!tmp)
goto error;
}
s->func.arg1 = tmp;
} else if (s->sel->flags & SEL_FLAG_FUNC2) {
- char *tmp = amd_strdup(value1);
+ tmp = amd_strdup(value1);
if (!tmp)
goto error;
s->func.arg1 = tmp;
--- autofs-5.1.4.orig/modules/lookup_ldap.c
+++ autofs-5.1.4/modules/lookup_ldap.c
@@ -1137,6 +1137,7 @@ int parse_ldap_config(unsigned logopt, s
error(logopt,
MODPREFIX "stat(2) failed with error %s.",
strerror(errno));
+ free(auth_conf);
return 0;
}
@@ -1148,6 +1149,7 @@ int parse_ldap_config(unsigned logopt, s
"Please make sure that it is owned by root, group "
"is root, and the mode is 0600.",
auth_conf);
+ free(auth_conf);
return -1;
}
@@ -1182,9 +1184,11 @@ int parse_ldap_config(unsigned logopt, s
goto out;
}
- if (!usetls || ctxt->port == LDAPS_PORT)
+ if (!usetls || ctxt->port == LDAPS_PORT) {
use_tls = LDAP_TLS_DONT_USE;
- else {
+ if (usetls)
+ free(usetls);
+ } else {
if (!strcasecmp(usetls, "yes"))
use_tls = LDAP_TLS_INIT;
else if (!strcasecmp(usetls, "no"))
@@ -1194,6 +1198,7 @@ int parse_ldap_config(unsigned logopt, s
MODPREFIX
"The usetls property must have value "
"\"yes\" or \"no\".");
+ free(usetls);
ret = -1;
goto out;
}
@@ -1221,6 +1226,7 @@ int parse_ldap_config(unsigned logopt, s
MODPREFIX
"The tlsrequired property must have value "
"\"yes\" or \"no\".");
+ free(tlsrequired);
ret = -1;
goto out;
}
@@ -1252,6 +1258,7 @@ int parse_ldap_config(unsigned logopt, s
MODPREFIX
"The authrequired property must have value "
"\"yes\", \"no\", \"autodetect\", or \"simple\".");
+ free(authrequired);
ret = -1;
goto out;
}
@@ -1338,6 +1345,7 @@ auth_fail:
(void)get_property(logopt, root, "credentialcache", &client_cc);
ctxt->auth_conf = auth_conf;
+ auth_conf = NULL;
ctxt->use_tls = use_tls;
ctxt->tls_required = tls_required;
ctxt->auth_required = auth_required;
@@ -1375,8 +1383,12 @@ auth_fail:
user, secret ? "specified" : "unspecified",
client_princ, client_cc);
}
+ if (authtype)
+ free(authtype);
out:
xmlFreeDoc(doc);
+ if (auth_conf)
+ free(auth_conf);
if (fallback)
return 0;
@@ -1986,7 +1998,7 @@ int lookup_read_master(struct master *ma
}
} else if (count == 1) {
dec_len = decode_percent_hack(keyValue[0], &key);
- if (dec_len < 0) {
+ if (dec_len <= 0) {
error(logopt, MODPREFIX
"invalid map key %s - ignoring",
*keyValue);
@@ -1994,7 +2006,7 @@ int lookup_read_master(struct master *ma
}
} else {
dec_len = decode_percent_hack(keyValue[0], &key);
- if (dec_len < 0) {
+ if (dec_len <= 0) {
error(logopt, MODPREFIX
"invalid map key %s - ignoring",
*keyValue);
@@ -2004,7 +2016,7 @@ int lookup_read_master(struct master *ma
for (i = 1; i < count; i++) {
char *k;
dec_len = decode_percent_hack(keyValue[i], &k);
- if (dec_len < 0) {
+ if (dec_len <= 0) {
error(logopt, MODPREFIX
"invalid map key %s - ignoring",
*keyValue);
@@ -2159,6 +2171,8 @@ static int decode_percent_hack(const cha
*key = NULL;
len = get_percent_decoded_len(name);
+ if (!len)
+ return 0;
new = malloc(len + 1);
if (!new)
return -1;
@@ -2998,6 +3012,9 @@ static int lookup_one(struct autofs_poin
attrs[1] = info;
attrs[2] = NULL;
+ enc_key1 = NULL;
+ enc_key2 = NULL;
+
if (*qKey == '*' && qKey_len == 1)
*qKey = '/';
else if (!strcasecmp(class, "nisObject")) {
--- autofs-5.1.4.orig/modules/parse_amd.c
+++ autofs-5.1.4/modules/parse_amd.c
@@ -1879,7 +1879,7 @@ struct amd_entry *make_default_entry(str
*/
map_type = conf_amd_get_map_type(ap->path);
if (map_type)
- defaults_entry->map_type = strdup(map_type);
+ defaults_entry->map_type = map_type;
/* The list should now be empty .... */
free_amd_entry_list(&dflts);
return defaults_entry;
@@ -2006,7 +2006,7 @@ static struct amd_entry *get_defaults_en
*/
char *map_type = conf_amd_get_map_type(ap->path);
if (map_type)
- entry->map_type = strdup(map_type);
+ entry->map_type = map_type;
}
free(expand);
}
--- autofs-5.1.4.orig/modules/parse_sun.c
+++ autofs-5.1.4/modules/parse_sun.c
@@ -443,8 +443,10 @@ int parse_reinit(int argc, const char *c
*new = default_context;
- if (do_init(argc, argv, new))
+ if (do_init(argc, argv, new)) {
+ free(new);
return 1;
+ }
kill_context(ctxt);
@@ -1143,6 +1145,9 @@ static int mount_subtree(struct autofs_p
const char *root;
int ro_len;
+ myoptions = NULL;
+ ro_loc = NULL;
+
rv = parse_mapent(ro->mapent,
options, &myoptions, &ro_loc, ap->logopt);
if (!rv) {
@@ -1524,6 +1529,9 @@ dont_expand:
p += l;
p = skipspace(p);
+ myoptions = NULL;
+ loc = NULL;
+
l = parse_mapent(p, options, &myoptions, &loc, ap->logopt);
if (!l) {
cache_delete_offset_list(mc, name);
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -26,6 +26,7 @@ xx/xx/2018 autofs-5.1.5
- fix NFS version mask usage.
- fix fd leak in rpc_do_create_client().
- add-man page note about extra slashes in paths.
+- covarity fixes.
19/12/2017 autofs-5.1.4
- fix spec file url.

View File

@ -0,0 +1,48 @@
autofs-5.1.4 - dont allow trailing slash in master map mount points
From: Ian Kent <raven@themaw.net>
If a master map mount point path has a trailing '/' this can cause
problems so remove them at parse time.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 1e5ec15b..a7bb89dc 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,6 +12,7 @@ xx/xx/2018 autofs-5.1.5
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapsed.
- Makefiles.rules: remove 'samples' from SUBDIRS.
+- dont allow trailing slash in master map mount points.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/master_parse.y b/lib/master_parse.y
index 42e03c2d..761ade9b 100644
--- a/lib/master_parse.y
+++ b/lib/master_parse.y
@@ -749,6 +749,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
struct map_source *source;
unsigned int logopt = logging;
unsigned int m_logopt = master->logopt;
+ size_t mp_len;
int ret;
local_init_vars();
@@ -763,6 +764,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
return 0;
}
+ mp_len = strlen(path);
+ while (mp_len && path[--mp_len] == '/')
+ path[mp_len] = 0;
+
nc = master->nc;
/* Add null map entries to the null map cache */

View File

@ -0,0 +1,56 @@
autofs-5.1.4 - dont use array for path when not necessary
From: Ian Kent <raven@themaw.net>
In parse_amd.c:do_link_mount() a character array is used to construct
a path when a pointer to the relevant amd entry field is sufficient.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 0f30596f..13f01397 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@ xx/xx/2018 autofs-5.1.5
- fix directory create permission.
- fix use after free in do_master_list_reset().
- fix deadlock in dumpmaps.
+- dont use array for path when not necessary.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index c4b3ef0b..2cce5417 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -967,8 +967,8 @@ static int do_auto_mount(struct autofs_point *ap, const char *name,
static int do_link_mount(struct autofs_point *ap, const char *name,
struct amd_entry *entry, unsigned int flags)
{
- char target[PATH_MAX + 1];
const char *opts = (entry->opts && *entry->opts) ? entry->opts : NULL;
+ char *target;
int ret;
if (entry->sublink) {
@@ -977,14 +977,14 @@ static int do_link_mount(struct autofs_point *ap, const char *name,
"error: sublink option length is too long");
return 0;
}
- strcpy(target, entry->sublink);
+ target = entry->sublink;
} else {
if (strlen(entry->fs) > PATH_MAX) {
error(ap->logopt, MODPREFIX
"error: fs option length is too long");
return 0;
}
- strcpy(target, entry->fs);
+ target = entry->fs;
}
if (!(flags & CONF_AUTOFS_USE_LOFS))

View File

@ -0,0 +1,69 @@
autofs-5.1.4 - fix NFS version mask usage
From: Ian Kent <raven@themaw.net>
Upstream commit a8af65195 changed NFS_VERS_MASK to exclude NFSv2
so NFSv2 would be excluded in the default availability probe.
But NFS_VERS_MASK is used like a mask elsewhere and causes NFSv2
to be cleared for the availability probe even when it is requested.
So add a macro to NFS_VERS_DEFAULT (and accompanying macros) to be
used to set initial defaults and restore NFS_VERS_MASK to what it
should be when used as a mask.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/replicated.h | 5 ++++-
modules/mount_nfs.c | 6 +++---
3 files changed, 8 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -23,6 +23,7 @@ xx/xx/2018 autofs-5.1.5
- tiny patch for autofs typo and possible bug.
- add units After line to include statd service.
- use systemd sd_notify() at startup.
+- fix NFS version mask usage.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/replicated.h
+++ autofs-5.1.4/include/replicated.h
@@ -26,7 +26,9 @@
#define NFS2_SUPPORTED 0x0010
#define NFS3_SUPPORTED 0x0020
#define NFS4_SUPPORTED 0x0040
-#define NFS_VERS_MASK (NFS3_SUPPORTED)
+#define NFS_VERS_DEFAULT (NFS3_SUPPORTED)
+#define NFS_VERS_MASK (NFS2_SUPPORTED|NFS3_SUPPORTED)
+#define NFS4_VERS_DEFAULT (NFS4_SUPPORTED)
#define NFS4_VERS_MASK (NFS4_SUPPORTED)
#define NFS2_REQUESTED NFS2_SUPPORTED
@@ -39,6 +41,7 @@
#define UDP_REQUESTED UDP_SUPPORTED
#define TCP6_REQUESTED 0x0100
#define UDP6_REQUESTED 0x0200
+#define NFS_PROTO_DEFAULT (TCP_SUPPORTED|UDP_SUPPORTED)
#define NFS_PROTO_MASK (TCP_SUPPORTED|UDP_SUPPORTED)
#define NFS2_TCP_SUPPORTED NFS2_SUPPORTED
--- autofs-5.1.4.orig/modules/mount_nfs.c
+++ autofs-5.1.4/modules/mount_nfs.c
@@ -86,11 +86,11 @@ int mount_mount(struct autofs_point *ap,
root, name, what, fstype, options);
mount_default_proto = defaults_get_mount_nfs_default_proto();
- vers = NFS_VERS_MASK | NFS_PROTO_MASK;
+ vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
if (strcmp(fstype, "nfs4") == 0)
- vers = NFS4_VERS_MASK | TCP_SUPPORTED;
+ vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED;
else if (mount_default_proto == 4)
- vers = vers | NFS4_VERS_MASK;
+ vers = vers | NFS4_VERS_DEFAULT;
/* Extract "nosymlink" pseudo-option which stops local filesystems
* from being symlinked.

View File

@ -0,0 +1,42 @@
autofs-5.1.4 - fix age setting at startup
From: Ian Kent <raven@themaw.net>
Commit 2b567ace7d, which resets the master map list on startup
before retrying a read, incorrectly sets age using time() when
it should use monotonic_time().
This causes lookup failures for submounts in cases where a master
map read retry was needed.
The failure happens because the mount entry age is greater than
the map entry age which is meant to indicate the map is no longer
valid which is not the case.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -32,6 +32,7 @@ xx/xx/2018 autofs-5.1.5
- mark removed cache entry negative.
- set bind mount as propagation slave.
- add master map pseudo options for mount propagation.
+- fix age setting at startup.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -2610,7 +2610,7 @@ int main(int argc, char *argv[])
* we have anyway.
*/
do_master_list_reset(master_list);
- age = time(NULL);
+ age = monotonic_time(NULL);
master_read_master(master_list, age, 1);
}
}

View File

@ -0,0 +1,66 @@
autofs-5.1.4 - fix amd parser opts option handling
From: Ian Kent <raven@themaw.net>
The recent implementation of the amd map program mount feature
introduced a regression in the amd parser where only the first
option of a comma separated list of is applied to a mount entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/amd_parse.y | 4 ++--
modules/parse_amd.c | 4 +++-
3 files changed, 6 insertions(+), 3 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -35,6 +35,7 @@ xx/xx/2018 autofs-5.1.5
- fix age setting at startup.
- fix use after free in parse_ldap_config().
- fix incorrect locking in sss lookup.
+- fix amd parser opts option handling.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/amd_parse.y
+++ autofs-5.1.4/modules/amd_parse.y
@@ -401,7 +401,7 @@ option_assignment: MAP_OPTION OPTION_ASS
}
| MNT_OPTION OPTION_ASSIGN options
{
- if (!match_mnt_option_options($1, $3)) {
+ if (!match_mnt_option_options($1, opts)) {
amd_notify($1);
YYABORT;
}
@@ -409,7 +409,7 @@ option_assignment: MAP_OPTION OPTION_ASS
}
| MNT_OPTION OPTION_ASSIGN QUOTE options QUOTE
{
- if (!match_mnt_option_options($1, $4)) {
+ if (!match_mnt_option_options($1, opts)) {
amd_notify($1);
YYABORT;
}
--- autofs-5.1.4.orig/modules/parse_amd.c
+++ autofs-5.1.4/modules/parse_amd.c
@@ -2136,6 +2136,7 @@ int parse_mount(struct autofs_point *ap,
list_del_init(&this->list);
cur_defaults = this;
update_with_defaults(defaults_entry, cur_defaults, sv);
+ debug(ap->logopt, "merged /defaults entry with defaults");
continue;
} else if (this->flags & AMD_DEFAULTS_RESET) {
struct amd_entry *nd, *new;
@@ -2174,8 +2175,9 @@ int parse_mount(struct autofs_point *ap,
at_least_one = 1;
- debug(ap->logopt, "expand mount entry");
+ debug(ap->logopt, "update mount entry with defaults");
update_with_defaults(cur_defaults, this, sv);
+ debug(ap->logopt, "expand mount entry");
sv = expand_entry(ap, this, flags, sv);
sv = merge_entry_options(ap, this, sv);
normalize_sublink(ap->logopt, this, sv);

View File

@ -0,0 +1,40 @@
autofs-5.1.4 - fix deadlock in dumpmaps
From: Ian Kent <raven@themaw.net>
Commit a223d11fa8e (autofs-5.1.3 - serialize calls to open_xxxx()
functions) introduces a deadlock when using the dumpmaps function.
In this case the open fd mutex needs to be unlocked in the forked
child process of the do_spawn() function.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 2747327b..0f30596f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ xx/xx/2018 autofs-5.1.5
- fix flag file permission.
- fix directory create permission.
- fix use after free in do_master_list_reset().
+- fix deadlock in dumpmaps.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/spawn.c b/daemon/spawn.c
index fabe577e..dbbca7fa 100644
--- a/daemon/spawn.c
+++ b/daemon/spawn.c
@@ -338,6 +338,7 @@ static int do_spawn(unsigned logopt, unsigned int wait,
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
close(pipefd[1]);
+ open_mutex_unlock();
/* what to mount must always be second last */
while (*pargv++)

View File

@ -0,0 +1,207 @@
autofs-5.1.4 - fix directory create permission
From: Ian Kent <raven@themaw.net>
autofs mount point directory creation is done using a permission of
0555.
But it is necessary to create directories within autofs mount points
for some map entry types so write access should be set for the owner
on mount point directories.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 2 ++
daemon/direct.c | 4 ++--
daemon/indirect.c | 2 +-
daemon/lookup.c | 2 +-
include/automount.h | 1 +
modules/mount_bind.c | 6 +++---
modules/mount_changer.c | 2 +-
modules/mount_ext2.c | 2 +-
modules/mount_generic.c | 2 +-
modules/mount_nfs.c | 2 +-
modules/parse_amd.c | 2 +-
12 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index d07d88ce..4faab510 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
xx/xx/2018 autofs-5.1.5
- fix flag file permission.
+- fix directory create permission.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/automount.c b/daemon/automount.c
index 5c739617..dcdc19fb 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -51,6 +51,8 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */
const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */
const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */
+unsigned int mp_mode = 0755;
+
unsigned int nfs_mount_uses_string_options = 0;
static struct nfs_mount_vers vers, check = {1, 1, 1};
diff --git a/daemon/direct.c b/daemon/direct.c
index 9a134351..3fdecdb8 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -424,7 +424,7 @@ int do_mount_autofs_direct(struct autofs_point *ap,
}
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(me->key, 0555) < 0) {
+ if (mkdir_path(me->key, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
crit(ap->logopt,
"failed to create mount directory %s", me->key);
@@ -739,7 +739,7 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *
strcat(mountpoint, offset);
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(mountpoint, 0555) < 0) {
+ if (mkdir_path(mountpoint, mp_mode) < 0) {
if (errno == EEXIST) {
/*
* If the mount point directory is a real mount
diff --git a/daemon/indirect.c b/daemon/indirect.c
index ffb11b8c..03c081ed 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -133,7 +133,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
}
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(root, 0555) < 0) {
+ if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
crit(ap->logopt,
"failed to create autofs directory %s",
diff --git a/daemon/lookup.c b/daemon/lookup.c
index cb67e7d9..6a722b3b 100644
--- a/daemon/lookup.c
+++ b/daemon/lookup.c
@@ -802,7 +802,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
goto next;
}
- ret = mkdir_path(fullpath, 0555);
+ ret = mkdir_path(fullpath, mp_mode);
if (ret < 0 && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
warn(ap->logopt,
diff --git a/include/automount.h b/include/automount.h
index 2e2c2b02..e5c19d23 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -269,6 +269,7 @@ void reset_signals(void);
int do_mount(struct autofs_point *ap, const char *root, const char *name,
int name_len, const char *what, const char *fstype,
const char *options);
+extern unsigned int mp_mode;
int mkdir_path(const char *path, mode_t mode);
int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev);
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
index 4864ea51..5effa880 100644
--- a/modules/mount_bind.c
+++ b/modules/mount_bind.c
@@ -151,7 +151,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
@@ -203,7 +203,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
} else {
debug(ap->logopt,
MODPREFIX "calling mkdir_path %s", basepath);
- if (mkdir_path(basepath, 0555) && errno != EEXIST) {
+ if (mkdir_path(basepath, mp_mode) && errno != EEXIST) {
char *estr;
estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
@@ -219,7 +219,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
"failed to create symlink %s -> %s",
fullpath, what);
if ((ap->flags & MOUNT_FLAG_GHOST) && !status) {
- if (mkdir_path(fullpath, 0555) && errno != EEXIST) {
+ if (mkdir_path(fullpath, mp_mode) && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
MODPREFIX "mkdir_path %s failed: %s",
diff --git a/modules/mount_changer.c b/modules/mount_changer.c
index 798f23b2..7d44a720 100644
--- a/modules/mount_changer.c
+++ b/modules/mount_changer.c
@@ -87,7 +87,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
index 90fc0876..3bbea95a 100644
--- a/modules/mount_ext2.c
+++ b/modules/mount_ext2.c
@@ -69,7 +69,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
index ae637875..b1a3adbf 100644
--- a/modules/mount_generic.c
+++ b/modules/mount_generic.c
@@ -68,7 +68,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index bf712a93..77166544 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -277,7 +277,7 @@ dont_probe:
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index b40c1ad1..c4b3ef0b 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1288,7 +1288,7 @@ static int do_program_mount(struct autofs_point *ap,
rv = 0;
ext_mount_add(&entry->ext_mount, entry->fs, 1);
} else {
- rv = mkdir_path(entry->fs, 0555);
+ rv = mkdir_path(entry->fs, mp_mode);
if (rv && errno != EEXIST) {
char buf[MAX_ERR_BUF];
char *estr;

View File

@ -0,0 +1,35 @@
autofs-5.1.4 - fix error return in do_nfs_mount()
From: Ian Kent <raven@themaw.net>
Fix incorrect error return in modules/parse_amd.c:do_nfs_mount().
---
CHANGELOG | 1 +
modules/parse_amd.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 756ef927..d0cfa19b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@ xx/xx/2018 autofs-5.1.5
- dont use array for path when not necessary.
- fix prefix option handling in expand_entry().
- fix sublink option not set from defaults.
+- fix error return in do_nfs_mount().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 1c962fff..2a5d9a30 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1099,7 +1099,7 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
if (strlen(entry->rhost) + strlen(entry->rfs) + 1 > PATH_MAX) {
error(ap->logopt, MODPREFIX
"error: rhost + rfs options length is too long");
- return 0;
+ return 1;
}
strcpy(target, entry->rhost);

View File

@ -0,0 +1,46 @@
autofs-5.1.4 - fix fd leak in rpc_do_create_client()
From: Ian Kent <raven@themaw.net>
Commit 94f87e203a (fix create_client() RPC client handling) fixed
possible use of an invalid RPC client handle but the change neglected
to account for a check in rpc_do_create_client() that would open a new
file descriptor without checking if the passed in descriptor was
already opened.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/rpc_subs.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -24,6 +24,7 @@ xx/xx/2018 autofs-5.1.5
- add units After line to include statd service.
- use systemd sd_notify() at startup.
- fix NFS version mask usage.
+- fix fd leak in rpc_do_create_client().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/rpc_subs.c
+++ autofs-5.1.4/lib/rpc_subs.c
@@ -183,7 +183,7 @@ static int rpc_do_create_client(struct s
in4_laddr.sin_addr.s_addr = htonl(INADDR_ANY);
slen = sizeof(struct sockaddr_in);
- if (!info->client) {
+ if (!info->client && *fd == RPC_ANYSOCK) {
struct sockaddr *laddr;
*fd = open_sock(addr->sa_family, type, proto);
@@ -296,7 +296,7 @@ static int rpc_do_create_client(struct s
* it would bind to a reserved port, which has been shown to
* exhaust the reserved port range in some situations.
*/
- if (!info->client) {
+ if (!info->client && *fd == RPC_ANYSOCK) {
*fd = open_sock(addr->sa_family, type, proto);
if (*fd < 0) {
ret = -errno;

View File

@ -0,0 +1,41 @@
autofs-5.1.4 - fix flag file permission
From: Ian Kent <raven@themaw.net>
The flag file used to check if automount(8) is running was being
created with mode 0 which caused unnecessary dac_override AVC
failures.
There's no reason to protect this file so just use 0644 as the
file permission.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 3 +++
daemon/flag.c | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 246279ae..d07d88ce 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+xx/xx/2018 autofs-5.1.5
+- fix flag file permission.
+
19/12/2017 autofs-5.1.4
- fix spec file url.
- fix unset tsd group name handling.
diff --git a/daemon/flag.c b/daemon/flag.c
index 99f26847..ff9858c8 100644
--- a/daemon/flag.c
+++ b/daemon/flag.c
@@ -164,7 +164,7 @@ int aquire_flag_file(void)
while (!we_created_flagfile) {
int errsv, i, j;
- i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0);
+ i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0644);
if (i < 0) {
release_flag_file();
return 0;

View File

@ -0,0 +1,40 @@
autofs-5.1.4 - fix incorrect locking in sss lookup
From: Ian Kent <raven@themaw.net>
Commit 766e0f6c4, autofs-5.0.7 - fix fix wildcard multi map regression,
introduced a deadlock during restart when the sss modules is used.
Looking at the comment above the code which takes the lock it clearly
does this incorrectly.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_sss.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -34,6 +34,7 @@ xx/xx/2018 autofs-5.1.5
- add master map pseudo options for mount propagation.
- fix age setting at startup.
- fix use after free in parse_ldap_config().
+- fix incorrect locking in sss lookup.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/lookup_sss.c
+++ autofs-5.1.4/modules/lookup_sss.c
@@ -786,9 +786,9 @@ int lookup_mount(struct autofs_point *ap
* when we're starting up so just take the readlock in that
*/
if (ap->flags & MOUNT_FLAG_REMOUNT)
- cache_writelock(mc);
- else
cache_readlock(mc);
+ else
+ cache_writelock(mc);
me = cache_lookup(mc, key);
/* Stale mapent => check for entry in alternate source or wildcard */
if (me && !me->mapent) {

View File

@ -0,0 +1,94 @@
autofs-5.1.4 - fix libresolv configure check
From: Ian Kent <raven@themaw.net>
The libresolv functions are not found by AC_CHECK_LIB() unless
they are prefixed with "__".
So change the library check to also look for __<function> during
the check.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
configure | 41 +++++++++++++++++++++++++++++++++++++++++
configure.in | 2 +-
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index a7bb89dc..dbfb8389 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -13,6 +13,7 @@ xx/xx/2018 autofs-5.1.5
- fix monotonic_elapsed.
- Makefiles.rules: remove 'samples' from SUBDIRS.
- dont allow trailing slash in master map mount points.
+- fix libresolv configure check.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/configure b/configure
index 2d517aac..5c8aae30 100755
--- a/configure
+++ b/configure
@@ -4821,6 +4821,47 @@ fi
$as_echo "$ac_cv_lib_resolv_res_query" >&6; }
if test "x$ac_cv_lib_resolv_res_query" = xyes; then :
LIBRESOLV="-lresolv"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_query in -lresolv" >&5
+$as_echo_n "checking for __res_query in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv___res_query+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __res_query ();
+int
+main ()
+{
+return __res_query ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv___res_query=yes
+else
+ ac_cv_lib_resolv___res_query=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___res_query" >&5
+$as_echo "$ac_cv_lib_resolv___res_query" >&6; }
+if test "x$ac_cv_lib_resolv___res_query" = xyes; then :
+ LIBRESOLV="-lresolv"
+fi
+
fi
diff --git a/configure.in b/configure.in
index d74775cc..4d1208f5 100644
--- a/configure.in
+++ b/configure.in
@@ -217,7 +217,7 @@ AC_SUBST(NSL_LIBS)
NSL_CFLAGS=""
])
-AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
+AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv", AC_CHECK_LIB(resolv, __res_query, LIBRESOLV="-lresolv"))
AC_SUBST(LIBRESOLV)
#

View File

@ -0,0 +1,49 @@
autofs-5.1.4 - fix monotonic_elapsed
From: NeilBrown <neilb@suse.com>
When automount probes multiple hosts to find the one which
responds most quickly, it currently ignores the nanoseconds.
This often makes the cost "0", which makes weights ineffective.
The cause is that monotonic_elapsed() casts tv_nsec to a
double *after* dividing by 1 billion, rather than before.
With this change, weights become effective for choosing
between hosts which respond in under one second.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/rpc_subs.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 104fca90..313730b1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5
- add error handling for ext_mount_add().
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
+- fix monotonic_elapsed.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 73097c9d..60ede9f8 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end)
double t1, t2;
t1 = (double) start.tv_sec +
- (double) (start.tv_nsec/(1000*1000*1000));
+ ((double) start.tv_nsec/(1000*1000*1000));
t2 = (double) end.tv_sec +
- (double) (end.tv_nsec/(1000*1000*1000));
+ ((double) end.tv_nsec/(1000*1000*1000));
return t2 - t1;
}

View File

@ -0,0 +1,55 @@
autofs-5.1.4 - fix prefix option handling in expand_entry()
From: Ian Kent <raven@themaw.net>
The changes to fix the defaults handling in the amd map parser caused
the prefix option to not be expanded and also to not be propagated to
submounts in some cases.
But the prefix should be expanded in modules/parse_amd.c:expand_entry()
along with the reset of the amd map entry fields.
Just adding this to modules/parse_amd.c:expand_entry() (where it should
be) fixes the amd map entry expansion and also fixes the propagation
of the prefix to submounts.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 11 +++++++++++
2 files changed, 12 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 13f01397..19aec2ae 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ xx/xx/2018 autofs-5.1.5
- fix use after free in do_master_list_reset().
- fix deadlock in dumpmaps.
- dont use array for path when not necessary.
+- fix prefix option handling in expand_entry().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 2cce5417..1a5a2960 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -725,6 +725,17 @@ static struct substvar *expand_entry(struct autofs_point *ap,
entry->rhost = host;
}
next:
+ if (entry->pref) {
+ if (expand_selectors(ap, entry->pref, &expand, sv)) {
+ debug(logopt, MODPREFIX
+ "pref expand(\"%s\") -> %s",
+ entry->pref, expand);
+ free(entry->pref);
+ entry->pref = expand;
+ }
+ sv = macro_addvar(sv, "pref", 4, entry->pref);
+ }
+
if (entry->sublink) {
if (expand_selectors(ap, entry->sublink, &expand, sv)) {
debug(logopt, MODPREFIX

View File

@ -0,0 +1,40 @@
autofs-5.1.4 - fix program usage message
From: Ian Kent <raven@themaw.net>
There is a discrepancy between the list of options in the usage
message of automount(8) and the options listed in the man page.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -27,6 +27,7 @@ xx/xx/2018 autofs-5.1.5
- fix fd leak in rpc_do_create_client().
- add-man page note about extra slashes in paths.
- covarity fixes.
+- fix program usage message.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1893,9 +1893,13 @@ static void usage(void)
" -h --help this text\n"
" -p --pid-file f write process id to file f\n"
" -t --timeout n auto-unmount in n seconds (0-disable)\n"
+ " -M --master-wait n\n"
+ " maximum wait time (seconds) for master\n"
+ " map to become available\n"
" -v --verbose be verbose\n"
" -d --debug log debuging info\n"
- " -D --define define global macro variable\n"
+ " -Dvariable=value, --define variable=value\n"
+ " define global macro variable\n"
" -f --foreground do not fork into background\n"
" -r --random-multimount-selection\n"
" use ramdom replicated server selection\n"

View File

@ -0,0 +1,48 @@
autofs-5.1.4 - fix sublink option not set from defaults
From: Ian Kent <raven@themaw.net>
If the amd entry sublink option is given in a defaults entry
it isn't merged into the current entry during parsing.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 19aec2ae..756ef927 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ xx/xx/2018 autofs-5.1.5
- fix deadlock in dumpmaps.
- dont use array for path when not necessary.
- fix prefix option handling in expand_entry().
+- fix sublink option not set from defaults.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 1a5a2960..1c962fff 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -645,6 +645,18 @@ static void update_with_defaults(struct amd_entry *defaults,
}
}
+ if (!entry->sublink) {
+ if (defaults->sublink) {
+ tmp = strdup(defaults->sublink);
+ if (tmp)
+ entry->sublink = tmp;
+ } else {
+ v = macro_findvar(sv, "sublink", 2);
+ if (v)
+ entry->sublink = strdup(v->val);
+ }
+ }
+
return;
}

View File

@ -0,0 +1,98 @@
autofs-5.1.4 - fix update_negative_cache() map source usage
From: Ian Kent <raven@themaw.net>
File map sources can be either plain text or executable.
When the map path is specified without a type (eg. when a
full path is used) an instance map source is used and the
original map is left unchanged.
But update_negative_cache() fails to take this into account
causing it to update the wrong map cache.
When a map reload is done the map entry appears to not exist
so the new map entry is added.
This could go unnoticed except that, after a map read, the
map entry cache cleans stale map entries and the existence
of this negative entry causes the new map entry to be deleted
and map lookups continue to fail.
In hindsite the use of an instance map source for this is
probably uneccessary but changing it will be risky so, for
now, just make update_negative_cache() use the correct map.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++--
2 files changed, 37 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -28,6 +28,7 @@ xx/xx/2018 autofs-5.1.5
- add-man page note about extra slashes in paths.
- covarity fixes.
- fix program usage message.
+- fix update_negative_cache() map source usage.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/lookup.c
+++ autofs-5.1.4/daemon/lookup.c
@@ -1100,6 +1100,37 @@ static enum nsswitch_status lookup_map_n
return result;
}
+static struct map_source *lookup_get_map_source(struct master_mapent *entry)
+{
+ struct map_source *map = entry->maps;
+ struct stat st;
+ char *type;
+
+ if (map->type || *map->argv[0] != '/')
+ return map;
+
+ if (*(map->argv[0] + 1) == '/')
+ return map;
+
+ if (stat(map->argv[0], &st) == -1)
+ return NULL;
+
+ if (!S_ISREG(st.st_mode))
+ return NULL;
+
+ if (st.st_mode & __S_IEXEC)
+ type = "program";
+ else
+ type = "file";
+
+ /* This is a file source with a path starting with "/".
+ * But file maps can be either plain text or executable
+ * so they use a map instance and the actual map source
+ * remains untouched.
+ */
+ return master_find_source_instance(map, type, map->format, 0, NULL);
+}
+
static void update_negative_cache(struct autofs_point *ap, struct map_source *source, const char *name)
{
struct master_mapent *entry = ap->entry;
@@ -1133,11 +1164,14 @@ static void update_negative_cache(struct
logmsg("key \"%s\" not found in map source(s).", name);
}
- /* Doesn't exist in any source, just add it somewhere */
+ /* Doesn't exist in any source, just add it somewhere.
+ * Also take care to use the same map source used by
+ * map reads and key lookups for the update.
+ */
if (source)
map = source;
else
- map = entry->maps;
+ map = lookup_get_map_source(entry);
if (map) {
time_t now = monotonic_time(NULL);
int rv = CHE_FAIL;

View File

@ -0,0 +1,55 @@
autofs-5.1.4 - fix use after free in do_master_list_reset()
From: Ian Kent <raven@themaw.net>
Umm ... list_for_each() can't be used in do_master_list_reset() because
the subject entry of the loop is removed for the list within the loop
body. Therefore it can't be used to calculate the next pointer within a
for (...) loop.
There is no list_for_each_safe() macro in the list.h of autofs so it
needs to be done manually.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 8 ++++++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 4faab510..2747327b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
xx/xx/2018 autofs-5.1.5
- fix flag file permission.
- fix directory create permission.
+- fix use after free in do_master_list_reset().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/automount.c b/daemon/automount.c
index dcdc19fb..28b3f2f5 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -2070,14 +2070,18 @@ static void remove_empty_args(char **argv, int *argc)
static void do_master_list_reset(struct master *master)
{
- struct list_head *head, *p;
+ struct list_head *head, *p, *n;
master_mutex_lock();
head = &master->mounts;
- list_for_each(p, head) {
+ n = head->next;
+ while (n != head) {
struct master_mapent *entry;
+ p = n;
+ n = p->next;
+
entry = list_entry(p, struct master_mapent, list);
if (!list_empty(&entry->list))

View File

@ -0,0 +1,34 @@
autofs-5.1.4 - fix use after free in parse_ldap_config()
From: Ian Kent <raven@themaw.net>
Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable
authtype after assigning it to a lookup context structure member.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_ldap.c | 2 --
2 files changed, 1 insertion(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -33,6 +33,7 @@ xx/xx/2018 autofs-5.1.5
- set bind mount as propagation slave.
- add master map pseudo options for mount propagation.
- fix age setting at startup.
+- fix use after free in parse_ldap_config().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/lookup_ldap.c
+++ autofs-5.1.4/modules/lookup_ldap.c
@@ -1383,8 +1383,6 @@ auth_fail:
user, secret ? "specified" : "unspecified",
client_princ, client_cc);
}
- if (authtype)
- free(authtype);
out:
xmlFreeDoc(doc);
if (auth_conf)

View File

@ -0,0 +1,123 @@
autofs-5.1.4 - improve hostname lookup error logging
From: Ian Kent <raven@themaw.net>
There's not enough information in name lookup log messages
to determine if the failed lookup is in fact a problem or
is expected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/parse_subs.c | 3 ++-
lib/rpc_subs.c | 3 ++-
modules/dclist.c | 4 +++-
modules/parse_amd.c | 9 ++++++---
modules/replicated.c | 5 +++--
6 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index f771a433..596590a8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@ xx/xx/2018 autofs-5.1.5
- add fedfs-map-nfs4.c.
- add conditional inclusion of fedfs binaries.
- add an example fedfs master map entry to the installed master map.
+- improve hostname lookup error logging.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
index db784a58..841e81fd 100644
--- a/lib/parse_subs.c
+++ b/lib/parse_subs.c
@@ -476,7 +476,8 @@ unsigned int get_network_proximity(const char *name)
ret = getaddrinfo(name_or_num, NULL, &hints, &ni);
if (ret) {
- logerr("getaddrinfo: %s", gai_strerror(ret));
+ logerr("hostname lookup for %s failed: %s",
+ name_or_num, gai_strerror(ret));
return PROXIMITY_ERROR;
}
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 60ede9f8..cc83e84d 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -693,7 +693,8 @@ static int create_client(struct conn_info *info, CLIENT **client)
ret = getaddrinfo(info->host, NULL, &hints, &ai);
if (ret) {
error(LOGOPT_ANY,
- "hostname lookup failed: %s", gai_strerror(ret));
+ "hostname lookup for %s failed: %s",
+ info->host, gai_strerror(ret));
goto out_close;
}
diff --git a/modules/dclist.c b/modules/dclist.c
index 4daa199b..ba32134d 100644
--- a/modules/dclist.c
+++ b/modules/dclist.c
@@ -357,7 +357,9 @@ static char *getdnsdomainname(unsigned int logopt)
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
- error(logopt, "hostname lookup failed: %s", gai_strerror(ret));
+ error(logopt,
+ "hostname lookup for %s failed: %s",
+ name, gai_strerror(ret));
return NULL;
}
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index e7debc56..9543ced3 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -260,7 +260,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
ret = getaddrinfo(v->val, NULL, &hints, &cni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s\n", gai_strerror(ret));
+ "hostname lookup for %s failed: %s\n",
+ v->val, gai_strerror(ret));
goto out;
}
@@ -270,7 +271,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s\n", gai_strerror(ret));
+ "hostname lookup for %s failed: %s\n",
+ name, gai_strerror(ret));
freeaddrinfo(cni);
goto out;
}
@@ -678,7 +680,8 @@ static char *normalize_hostname(unsigned int logopt, const char *host,
ret = getaddrinfo(host, NULL, &hints, &ni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s", gai_strerror(ret));
+ "hostname lookup for %s failed: %s",
+ host, gai_strerror(ret));
return NULL;
}
name = strdup(ni->ai_canonname);
diff --git a/modules/replicated.c b/modules/replicated.c
index f7b83236..740270ec 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -1007,8 +1007,9 @@ try_name:
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
- error(LOGOPT_ANY, "hostname lookup failed: %s",
- gai_strerror(ret));
+ error(LOGOPT_ANY,
+ "hostname lookup for %s failed: %s",
+ name, gai_strerror(ret));
free(name);
return 0;
}

View File

@ -0,0 +1,41 @@
autofs-5.1.4 - make umount_ent() recognise forced umount
From: Ian Kent <raven@themaw.net>
When doing a forced shutdown umount_ent() tries a normal expire
first resulting in a fair amount of unnecessary log noise.
Change umount_ent() to do a forced expire when a forced shutdown
has been requested to avoid the log noise.
Signed-off-by: Ian Kent <raven@themaw.net>
---
lib/mounts.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -2984,14 +2984,16 @@ int umount_ent(struct autofs_point *ap,
{
int rv;
- rv = spawn_umount(ap->logopt, path, NULL);
- /* We are doing a forced shutcwdown down so unlink busy mounts */
- if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
- if (ap->state == ST_SHUTDOWN_FORCE) {
- info(ap->logopt, "forcing umount of %s", path);
- rv = spawn_umount(ap->logopt, "-l", path, NULL);
- }
+ if (ap->state != ST_SHUTDOWN_FORCE)
+ rv = spawn_umount(ap->logopt, path, NULL);
+ else {
+ /* We are doing a forced shutdown so unlink busy
+ * mounts */
+ info(ap->logopt, "forcing umount of %s", path);
+ rv = spawn_umount(ap->logopt, "-l", path, NULL);
+ }
+ if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
/*
* Verify that we actually unmounted the thing. This is a
* belt and suspenders approach to not eating user data.

View File

@ -0,0 +1,64 @@
autofs-5.1.4 - mark removed cache entry negative
From: Ian Kent <raven@themaw.net>
When re-reading a map entries that have been removed are detected
and deleted from the map entry cache by lookup_prune_cache().
If a removed map entry is mounted at the time lookup_prune_cache()
is called the map entry is skippedi. This is done becuase the next
lookup (following the mount expire, which needs the cache entry to
remain) will detect the stale cache entry and a map update done
resulting in the istale entry being removed.
But if a map re-read is performed while the cache entry is mounted
the cache will appear to up to date so the removed entry will remain
valid even after it has expired.
To cover this case it's sufficient to mark the mounted cache entry
negative during the cache prune which prevent further lookups from
using the stale entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/lookup.c | 12 +++++++++---
2 files changed, 10 insertions(+), 3 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5
- covarity fixes.
- fix program usage message.
- fix update_negative_cache() map source usage.
+- mark removed cache entry negative.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/lookup.c
+++ autofs-5.1.4/daemon/lookup.c
@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autof
if (valid && valid->mc == mc) {
/*
* We've found a map entry that has been removed from
- * the current cache so it isn't really valid.
+ * the current cache so it isn't really valid. Set the
+ * mapent negative to prevent further mount requests
+ * using the cache entry.
*/
+ debug(ap->logopt, "removed map entry detected, mark negative");
+ if (valid->mapent) {
+ free(valid->mapent);
+ valid->mapent = NULL;
+ }
cache_unlock(valid->mc);
valid = NULL;
}
if (!valid &&
is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
- debug(ap->logopt,
- "prune check posponed, %s mounted", path);
+ debug(ap->logopt, "prune posponed, %s mounted", path);
free(key);
free(path);
continue;

View File

@ -0,0 +1,117 @@
autofs-5.1.4 - move close stdio descriptors to become_daemon()
From: Ian Kent <raven@themaw.net>
Move the stdio file descriptor close to the become_daemon() function
as closing these file descriptors, ie. detaching from ttys, is part
of the preperation for becoming a system daemon.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 27 ++++++++++++++++++++++++++-
include/log.h | 1 -
lib/log.c | 29 -----------------------------
4 files changed, 27 insertions(+), 31 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -42,6 +42,7 @@ xx/xx/2018 autofs-5.1.5
- add NULL check in prepare_attempt_prefix().
- update build info with systemd.
- use flags for startup boolean options.
+- move close stdio descriptors to become_daemon().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1218,6 +1218,8 @@ static void become_daemon(unsigned int f
}
log_to_stderr();
} else {
+ int nullfd;
+
if (open_pipe(start_pipefd) < 0) {
fprintf(stderr, "%s: failed to create start_pipefd.\n",
program);
@@ -1261,7 +1263,30 @@ static void become_daemon(unsigned int f
close(start_pipefd[1]);
exit(*pst_stat);
}
- log_to_syslog();
+
+ /* Redirect all our file descriptors to /dev/null */
+ nullfd = open("/dev/null", O_RDWR);
+ if (nullfd < 0) {
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ fprintf(stderr, "cannot open /dev/null: %s", estr);
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
+ close(start_pipefd[1]);
+ exit(*pst_stat);
+ }
+
+ if (dup2(nullfd, STDIN_FILENO) < 0 ||
+ dup2(nullfd, STDOUT_FILENO) < 0 ||
+ dup2(nullfd, STDERR_FILENO) < 0) {
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ fprintf(stderr,
+ "redirecting file descriptors failed: %s", estr);
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
+ close(start_pipefd[1]);
+ exit(*pst_stat);
+ }
+
+ open_log();
+ close(nullfd);
}
/* Write pid file if requested */
--- autofs-5.1.4.orig/include/log.h
+++ autofs-5.1.4/include/log.h
@@ -36,7 +36,6 @@ extern void set_log_debug_ap(struct auto
extern void set_mnt_logging(unsigned global_logopt);
extern void open_log(void);
-extern void log_to_syslog(void);
extern void log_to_stderr(void);
extern void log_info(unsigned int, const char* msg, ...);
--- autofs-5.1.4.orig/lib/log.c
+++ autofs-5.1.4/lib/log.c
@@ -314,35 +314,6 @@ void open_log(void)
return;
}
-void log_to_syslog(void)
-{
- char buf[MAX_ERR_BUF];
- int nullfd;
-
- open_log();
-
- /* Redirect all our file descriptors to /dev/null */
- nullfd = open("/dev/null", O_RDWR);
- if (nullfd < 0) {
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
- fprintf(stderr, "cannot open /dev/null: %s", estr);
- exit(1);
- }
-
- if (dup2(nullfd, STDIN_FILENO) < 0 ||
- dup2(nullfd, STDOUT_FILENO) < 0 ||
- dup2(nullfd, STDERR_FILENO) < 0) {
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
- fprintf(stderr,
- "redirecting file descriptors failed: %s", estr);
- exit(1);
- }
-
- close(nullfd);
-
- return;
-}
-
void log_to_stderr(void)
{
if (syslog_open) {

View File

@ -0,0 +1,222 @@
autofs-5.1.4 - remove autofs4 module load code
From: Ian Kent <raven@themaw.net>
The autofs kernel module has finally been renamed from autofs4 to
autofs so autoloading works so there is no need for manual loading.
The module load function has been commented out in the source for
a long time so there should not be any adverse affects from removing
it.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
configure | 61 ----------------------------------------------------
configure.in | 1
daemon/automount.c | 8 ------
daemon/module.c | 35 -----------------------------
include/automount.h | 7 -----
include/config.h.in | 6 -----
7 files changed, 1 insertion(+), 118 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -38,6 +38,7 @@ xx/xx/2018 autofs-5.1.5
- fix amd parser opts option handling.
- better handle hesiod support not built in.
- fix hesiod string check in master_parse().
+- remove autofs4 module load code.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/configure
+++ autofs-5.1.4/configure
@@ -659,8 +659,6 @@ PATH_YACC
YACC
PATH_LEX
LEX
-HAVE_MODPROBE
-MODPROBE
HAVE_E4FSCK
E4FSCK
HAVE_E3FSCK
@@ -4155,65 +4153,6 @@ else
HAVE_E4FSCK=0
fi
-for ac_prog in modprobe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MODPROBE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MODPROBE in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_MODPROBE="$MODPROBE" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $searchpath
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_MODPROBE="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-MODPROBE=$ac_cv_path_MODPROBE
-if test -n "$MODPROBE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MODPROBE" >&5
-$as_echo "$MODPROBE" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$MODPROBE" && break
-done
-
-if test -n "$MODPROBE"; then
-
-$as_echo "#define HAVE_MODPROBE 1" >>confdefs.h
-
-
-cat >>confdefs.h <<_ACEOF
-#define PATH_MODPROBE "$MODPROBE"
-_ACEOF
-
- HAVE_MODPROBE=1
-else
- HAVE_MODPROBE=0
-fi
-
for ac_prog in flex lex
do
--- autofs-5.1.4.orig/configure.in
+++ autofs-5.1.4/configure.in
@@ -161,7 +161,6 @@ AF_PATH_INCLUDE(UMOUNT, umount, /bin/umo
AF_PATH_INCLUDE(E2FSCK, fsck.ext2 e2fsck, , $searchpath)
AF_PATH_INCLUDE(E3FSCK, fsck.ext3 e3fsck, , $searchpath)
AF_PATH_INCLUDE(E4FSCK, fsck.ext4 e4fsck, , $searchpath)
-AF_PATH_INCLUDE(MODPROBE, modprobe, , $searchpath)
AF_CHECK_PROG(LEX, flex lex, , $searchpath)
AF_CHECK_PROG(YACC, bison, , $searchpath)
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -2336,14 +2336,6 @@ int main(int argc, char *argv[])
exit(exit_code);
}
-#if 0
- if (!load_autofs4_module()) {
- fprintf(stderr, "%s: can't load %s filesystem module.\n",
- program, FS_MODULE_NAME);
- exit(1);
- }
-#endif
-
/* Don't need the kernel module just to look at the configured maps */
if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
fprintf(stderr,
--- autofs-5.1.4.orig/daemon/module.c
+++ autofs-5.1.4/daemon/module.c
@@ -19,41 +19,6 @@
#include "automount.h"
#include "nsswitch.h"
-int load_autofs4_module(void)
-{
- FILE *fp;
- char buf[PATH_MAX];
- int ret;
-
- /*
- * Check if module already loaded or compiled in.
- * If both autofs v3 and v4 are coplied in and
- * the v3 module registers first or the v4 module
- * is an older version we will catch it at mount
- * time.
- */
- fp = open_fopen_r("/proc/filesystems");
- if (!fp) {
- logerr("cannot open /proc/filesystems");
- return 0;
- }
-
- while (fgets(buf, sizeof(buf), fp)) {
- if (strstr(buf, "autofs")) {
- fclose(fp);
- return 1;
- }
- }
- fclose(fp);
-
- ret = spawnl(LOGOPT_NONE, PATH_MODPROBE, PATH_MODPROBE,
- "-q", FS_MODULE_NAME, NULL);
- if (ret)
- return 0;
-
- return 1;
-}
-
int open_lookup(const char *name, const char *err_prefix, const char *mapfmt,
int argc, const char *const *argv, struct lookup_mod **lookup)
{
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -52,17 +52,10 @@
#error Failed to locate umount(8)!
#endif
-#ifndef HAVE_MODPROBE
-#error Failed to locate modprobe(8)!
-#endif
-
#ifndef HAVE_LINUX_PROCFS
#error Failed to verify existence of procfs filesystem!
#endif
-#define FS_MODULE_NAME "autofs4"
-int load_autofs4_module(void);
-
/* The -s (sloppy) option to mount is good, if we have it... */
#ifdef HAVE_SLOPPY_MOUNT
--- autofs-5.1.4.orig/include/config.h.in
+++ autofs-5.1.4/include/config.h.in
@@ -48,9 +48,6 @@
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
-/* define if you have MODPROBE */
-#undef HAVE_MODPROBE
-
/* define if you have MOUNT */
#undef HAVE_MOUNT
@@ -129,9 +126,6 @@
/* define if you have LEX */
#undef PATH_LEX
-/* define if you have MODPROBE */
-#undef PATH_MODPROBE
-
/* define if you have MOUNT */
#undef PATH_MOUNT

View File

@ -0,0 +1,37 @@
autofs-5.1.4 - remove unused function dump_master()
From: Ian Kent <raven@themaw.net>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master.c | 11 -----------
2 files changed, 1 insertion(+), 11 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -112,6 +112,7 @@ xx/xx/2018 autofs-5.1.5
- dont prune offset map entries.
- simplify sss source stale check.
- use defines for expire type.
+- remove unused function dump_master().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -1971,14 +1971,3 @@ int master_kill(struct master *master)
return 1;
}
-
-void dump_master(struct master *master)
-{
- struct list_head *p, *head;
-
- head = &master->mounts;
- list_for_each(p, head) {
- struct master_mapent *this = list_entry(p, struct master_mapent, list);
- logmsg("path %s", this->path);
- }
-}

View File

@ -0,0 +1,69 @@
autofs-5.1.4 - set bind mount as propagation slave
From: Ian Kent <raven@themaw.net>
When using a multi-mount with mount targets that are on the
local machine and resulting bind mounts are made to a file
system that is mount propagation shared (such as the root
file system on systemd managed systems) the autofs offset
mount triggers made within the bind mount will be propagated
back to the target file system.
When this happens the target of the offset (the unwanted
propagated mount) is itself an autofs trigger mount and
accessing the path results in a deadlock.
In order for these multi-mounts to function properly in this
case bind mounts that contain mount triggers must be set to
propagation slave or private so the backward propagation
doesn't occur.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_bind.c | 16 +++++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5
- fix program usage message.
- fix update_negative_cache() map source usage.
- mark removed cache entry negative.
+- set bind mount as propagation slave.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/mount_bind.c
+++ autofs-5.1.4/modules/mount_bind.c
@@ -20,6 +20,7 @@
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mount.h>
#define MODULE_MOUNT
#include "automount.h"
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap,
debug(ap->logopt,
MODPREFIX "mounted %s type %s on %s",
what, fstype, fullpath);
- return 0;
}
+
+ /* The bind mount has succeeded but if the target
+ * mount is propagation shared propagation of child
+ * mounts (autofs offset mounts for example) back to
+ * the target of the bind mount must be avoided or
+ * autofs trigger mounts will deadlock.
+ */
+ err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
+ if (err)
+ warn(ap->logopt,
+ "failed to set propagation type for %s",
+ fullpath);
+
+ return 0;
} else {
char *cp;
char basepath[PATH_MAX];

View File

@ -0,0 +1,48 @@
autofs-5.1.4 - tiny patch for autofs typo and possible bug
From: Todd Eigenschink <todd@fai2.com>
(1) The word "to" is doubled in two warnings.
(2) It prints a warning when it can't open the "old" config file, even
if it was able to open the default one. That's a reasonable warning if
it *couldn't* open the new one, but seems unnecessary if it could.
The patch removes the unneeded "to"s and only prints warning about the
old config file if it couldn't open the default one.
Signed-off-by: Todd Eigenschink <todd@fai2.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/defaults.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -20,6 +20,7 @@ xx/xx/2018 autofs-5.1.5
- add conditional inclusion of fedfs binaries.
- add an example fedfs master map entry to the installed master map.
- improve hostname lookup error logging.
+- tiny patch for autofs typo and possible bug.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/defaults.c
+++ autofs-5.1.4/lib/defaults.c
@@ -1207,12 +1207,12 @@ unsigned int defaults_read_config(unsign
conf = open_fopen_r(DEFAULT_CONFIG_FILE);
if (!conf)
- message(to_syslog, "failed to to open config %s",
+ message(to_syslog, "failed to open config %s",
DEFAULT_CONFIG_FILE);
oldconf = open_fopen_r(OLD_CONFIG_FILE);
- if (!oldconf)
- message(to_syslog, "failed to to open old config %s",
+ if (!oldconf && !conf)
+ message(to_syslog, "failed to open old config %s",
OLD_CONFIG_FILE);
/* Neither config has been updated */

View File

@ -0,0 +1,41 @@
autofs-5.1.4 - update build info with systemd
From: Ian Kent <raven@themaw.net>
Update the show_build_info() function to include systemd
build info.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 9 +++++++++
2 files changed, 10 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -40,6 +40,7 @@ xx/xx/2018 autofs-5.1.5
- fix hesiod string check in master_parse().
- remove autofs4 module load code.
- add NULL check in prepare_attempt_prefix().
+- update build info with systemd.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1951,6 +1951,15 @@ static void show_build_info(void)
}
#endif
+#ifdef WITH_SYSTEMD
+ printf("WITH_SYSTEMD ");
+ count = count + 13;
+
+ if (count > 60) {
+ printf("\n ");
+ count = 0;
+ }
+#endif
#ifdef WITH_HESIOD
printf("WITH_HESIOD ");

View File

@ -0,0 +1,100 @@
autofs-5.1.4 - use defines for expire type
From: Ian Kent <raven@themaw.net>
The kernel defines for expire type such as an immediate expire
shoule be used to clearify what is being requested.
AUTOFS_EXP_IMMEDIATE corresponds to a SIGUSR1 prune operation.
AUTOFS_EXP_FORCE corresponds to an expire type not yet implemented in
the kernel, a SIGUSR2 forced expire. Define it in our internal autofs
kernel include file, the kernel will ignore it if it doesn't support it.
AUTOFS_EXP_LEAVES is no longer used in autofs version 5.
Finally add a define AUTOFS_EXP_NORMAL to indicate we're perfoming a
normal expire.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/state.c | 8 ++++----
include/linux/auto_fs4.h | 6 ++++--
include/state.h | 2 +-
4 files changed, 10 insertions(+), 7 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -111,6 +111,7 @@ xx/xx/2018 autofs-5.1.5
- use a valid timeout in lookup_prune_one_cache().
- dont prune offset map entries.
- simplify sss source stale check.
+- use defines for expire type.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/state.c
+++ autofs-5.1.4/daemon/state.c
@@ -634,7 +634,7 @@ static unsigned int st_prepare_shutdown(
ap->state = ST_SHUTDOWN_PENDING;
/* Unmount everything */
- exp = expire_proc(ap, 1);
+ exp = expire_proc(ap, AUTOFS_EXP_IMMEDIATE);
switch (exp) {
case EXP_ERROR:
case EXP_PARTIAL:
@@ -660,7 +660,7 @@ static unsigned int st_force_shutdown(st
ap->state = ST_SHUTDOWN_FORCE;
/* Unmount everything */
- exp = expire_proc(ap, 1);
+ exp = expire_proc(ap, AUTOFS_EXP_FORCE | AUTOFS_EXP_IMMEDIATE);
switch (exp) {
case EXP_ERROR:
case EXP_PARTIAL:
@@ -695,7 +695,7 @@ static unsigned int st_prune(struct auto
assert(ap->state == ST_READY);
ap->state = ST_PRUNE;
- switch (expire_proc(ap, 1)) {
+ switch (expire_proc(ap, AUTOFS_EXP_IMMEDIATE)) {
case EXP_ERROR:
case EXP_PARTIAL:
if (!ap->submount)
@@ -716,7 +716,7 @@ static unsigned int st_expire(struct aut
assert(ap->state == ST_READY);
ap->state = ST_EXPIRE;
- switch (expire_proc(ap, 0)) {
+ switch (expire_proc(ap, AUTOFS_EXP_NORMAL)) {
case EXP_ERROR:
case EXP_PARTIAL:
if (!ap->submount)
--- autofs-5.1.4.orig/include/linux/auto_fs4.h
+++ autofs-5.1.4/include/linux/auto_fs4.h
@@ -27,8 +27,10 @@
#define AUTOFS_PROTO_SUBVERSION 2
/* Mask for expire behaviour */
-#define AUTOFS_EXP_IMMEDIATE 1
-#define AUTOFS_EXP_LEAVES 2
+#define AUTOFS_EXP_NORMAL 0x00
+#define AUTOFS_EXP_IMMEDIATE 0x01
+#define AUTOFS_EXP_LEAVES 0x02
+#define AUTOFS_EXP_FORCE 0x04
#define AUTOFS_TYPE_ANY 0U
#define AUTOFS_TYPE_INDIRECT 1U
--- autofs-5.1.4.orig/include/state.h
+++ autofs-5.1.4/include/state.h
@@ -55,7 +55,7 @@ struct expire_args {
unsigned int signaled;
struct autofs_point *ap; /* autofs mount we are working on */
enum states state; /* State prune or expire */
- unsigned int how; /* Normal, immediate expire ? */
+ unsigned int how; /* Normal, immediate, forced expire ? */
int status; /* Return status */
};

View File

@ -0,0 +1,217 @@
autofs-5.1.4 - use flags for startup boolean options
From: Ian Kent <raven@themaw.net>
The daemon uses a number of boolean flags each stored in unsigned int
variables. But a single bit flag is sufficient storage for most of
these flags.
So use bit flags for these where possible.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 45 ++++++++++++++++++++++-----------------------
include/automount.h | 6 ++++++
lib/master.c | 4 ++--
4 files changed, 31 insertions(+), 25 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -41,6 +41,7 @@ xx/xx/2018 autofs-5.1.5
- remove autofs4 module load code.
- add NULL check in prepare_attempt_prefix().
- update build info with systemd.
+- use flags for startup boolean options.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1195,7 +1195,7 @@ static int handle_packet(struct autofs_p
return -1;
}
-static void become_daemon(unsigned foreground, unsigned daemon_check)
+static void become_daemon(unsigned int flags)
{
FILE *pidfp;
char buf[MAX_ERR_BUF];
@@ -1210,8 +1210,8 @@ static void become_daemon(unsigned foreg
}
/* Detach from foreground process */
- if (foreground) {
- if (daemon_check && !aquire_flag_file()) {
+ if (flags & DAEMON_FLAGS_FOREGROUND) {
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
fprintf(stderr, "%s: program is already running.\n",
program);
exit(1);
@@ -1238,7 +1238,7 @@ static void become_daemon(unsigned foreg
}
close(start_pipefd[0]);
- if (daemon_check && !aquire_flag_file()) {
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
fprintf(stderr, "%s: program is already running.\n",
program);
/* Return success if already running */
@@ -2158,8 +2158,8 @@ int main(int argc, char *argv[])
{
int res, opt, status;
int logpri = -1;
- unsigned ghost, logging, daemon_check;
- unsigned dumpmaps, foreground, have_global_options;
+ unsigned int flags;
+ unsigned int logging;
unsigned master_read;
int master_wait;
time_t timeout;
@@ -2202,17 +2202,15 @@ int main(int argc, char *argv[])
nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check);
+ flags = defaults_get_browse_mode() ? DAEMON_FLAGS_GHOST : 0;
+ flags |= DAEMON_FLAGS_CHECK_DAEMON;
+
kpkt_len = get_kpkt_len();
master_wait = defaults_get_master_wait();
timeout = defaults_get_timeout();
- ghost = defaults_get_browse_mode();
logging = defaults_get_logging();
global_selection_options = 0;
global_options = NULL;
- have_global_options = 0;
- foreground = 0;
- dumpmaps = 0;
- daemon_check = 1;
remove_empty_args(argv, &argc);
@@ -2244,7 +2242,7 @@ int main(int argc, char *argv[])
break;
case 'f':
- foreground = 1;
+ flags |= DAEMON_FLAGS_FOREGROUND;
break;
case 'V':
@@ -2260,7 +2258,7 @@ int main(int argc, char *argv[])
break;
case 'm':
- dumpmaps = 1;
+ flags |= DAEMON_FLAGS_DUMP_MAPS;
break;
case 'M':
@@ -2268,9 +2266,9 @@ int main(int argc, char *argv[])
break;
case 'O':
- if (!have_global_options) {
+ if (!(flags & DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS)) {
global_options = strdup(optarg);
- have_global_options = 1;
+ flags |= DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS;
break;
}
printf("%s: global options already specified.\n",
@@ -2295,7 +2293,7 @@ int main(int argc, char *argv[])
break;
case 'C':
- daemon_check = 0;
+ flags &= ~DAEMON_FLAGS_CHECK_DAEMON;
break;
case 'F':
@@ -2346,7 +2344,8 @@ int main(int argc, char *argv[])
}
/* Don't need the kernel module just to look at the configured maps */
- if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
+ if (!(flags & DAEMON_FLAGS_DUMP_MAPS) &&
+ (!query_kproto_ver() || get_kver_major() < 5)) {
fprintf(stderr,
"%s: test mount forbidden or "
"incorrect kernel protocol version, "
@@ -2377,7 +2376,7 @@ int main(int argc, char *argv[])
/* Get processor information for predefined escapes */
macro_init();
- if (dumpmaps) {
+ if (flags & DAEMON_FLAGS_DUMP_MAPS) {
struct master_mapent *entry;
struct list_head *head, *p;
struct mapent_cache *nc;
@@ -2395,9 +2394,9 @@ int main(int argc, char *argv[])
}
if (master)
- master_list = master_new(NULL, timeout, ghost);
+ master_list = master_new(NULL, timeout, flags);
else
- master_list = master_new(master, timeout, ghost);
+ master_list = master_new(master, timeout, flags);
if (!master_list) {
printf("%s: can't create master map", program);
macro_free_global_table();
@@ -2443,9 +2442,9 @@ int main(int argc, char *argv[])
}
if (argc == 0)
- master_list = master_new(NULL, timeout, ghost);
+ master_list = master_new(NULL, timeout, flags);
else
- master_list = master_new(argv[0], timeout, ghost);
+ master_list = master_new(argv[0], timeout, flags);
if (!master_list) {
printf("%s: can't create master map %s", program, argv[0]);
@@ -2453,7 +2452,7 @@ int main(int argc, char *argv[])
exit(1);
}
- become_daemon(foreground, daemon_check);
+ become_daemon(flags);
if (pthread_attr_init(&th_attr)) {
logerr("%s: failed to init thread attribute struct!",
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -66,6 +66,12 @@
#define SLOPPY
#endif
+#define DAEMON_FLAGS_FOREGROUND 0x0001
+#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
+#define DAEMON_FLAGS_GHOST 0x0008
+#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
+#define DAEMON_FLAGS_DUMP_MAPS 0x0020
+
#define AUTOFS_SUPER_MAGIC 0x00000187L
#define SMB_SUPER_MAGIC 0x0000517BL
#define CIFS_MAGIC_NUMBER 0xFF534D42L
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -922,7 +922,7 @@ void master_free_mapent(struct master_ma
return;
}
-struct master *master_new(const char *name, unsigned int timeout, unsigned int ghost)
+struct master *master_new(const char *name, unsigned int timeout, unsigned int flags)
{
struct master *master;
char *tmp;
@@ -948,7 +948,7 @@ struct master *master_new(const char *na
master->depth = 0;
master->reading = 0;
master->read_fail = 0;
- master->default_ghost = ghost;
+ master->default_ghost = flags & DAEMON_FLAGS_GHOST;
master->default_timeout = timeout;
master->default_logging = defaults_get_logging();
master->logopt = master->default_logging;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,226 @@
autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas
From: NeilBrown <neilb@suse.com>
If several replicas have been specified for a mount point,
and use_hostname_for_mount is set to "yes", the selection
between these replicas is currently disabled and the last in
the list is always chosen.
There is little point selecting between different addresses
for the one host in this case, but it is still worth
selecting between different hosts, particularly if different
weights have been specified.
This patch restores the "prune_host_list()" functionality
when use_hostname_for_mount is set, and modifies it slightly
so that only on IP address for any host:/path entry in the
config file is willl be successfully probed. After a
success, further addresses from the same entry are skipped.
This is achieved by tracking an entry number ("ent_num") for
each 'struct host'.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/replicated.h | 3 ++-
modules/mount_nfs.c | 2 +-
modules/replicated.c | 35 ++++++++++++++++++++---------------
4 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 2d5d5b1f..104fca90 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5
- fix error return in do_nfs_mount().
- add error handling for ext_mount_add().
- account for recent libnsl changes.
+- use_hostname_for_mounts shouldn't prevent selection among replicas.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/include/replicated.h b/include/replicated.h
index 69ab7800..0f482d21 100644
--- a/include/replicated.h
+++ b/include/replicated.h
@@ -57,6 +57,7 @@
struct host {
char *name;
+ int ent_num;
struct sockaddr *addr;
size_t addr_len;
unsigned int rr;
@@ -70,7 +71,7 @@ struct host {
};
void seed_random(void);
-struct host *new_host(const char *, struct sockaddr *, size_t,
+struct host *new_host(const char *, int, struct sockaddr *, size_t,
unsigned int, unsigned int, unsigned int);
void free_host_list(struct host **);
int parse_location(unsigned, struct host **, const char *, unsigned int);
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index 77166544..4cf0cd27 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
(vers & NFS4_VERS_MASK) != 0 &&
!(vers & UDP6_REQUESTED)) {
unsigned int v4_probe_ok = 0;
- struct host *tmp = new_host(hosts->name,
+ struct host *tmp = new_host(hosts->name, 0,
hosts->addr, hosts->addr_len,
hosts->proximity,
hosts->weight, hosts->options);
diff --git a/modules/replicated.c b/modules/replicated.c
index 3ac4c70f..f7b83236 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -83,7 +83,7 @@ void seed_random(void)
return;
}
-struct host *new_host(const char *name,
+struct host *new_host(const char *name, int ent_num,
struct sockaddr *addr, size_t addr_len,
unsigned int proximity, unsigned int weight,
unsigned int options)
@@ -116,6 +116,7 @@ struct host *new_host(const char *name,
memset(new, 0, sizeof(struct host));
new->name = tmp1;
+ new->ent_num = ent_num;
new->addr_len = addr_len;
new->addr = tmp2;
new->proximity = proximity;
@@ -714,7 +715,7 @@ done:
int prune_host_list(unsigned logopt, struct host **list,
unsigned int vers, int port)
{
- struct host *this, *last, *first;
+ struct host *this, *last, *first, *prev;
struct host *new = NULL;
unsigned int proximity, selected_version = 0;
unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count;
@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list,
if (!*list)
return 0;
- /* If we're using the host name then there's no point probing
- * avialability and respose time.
- */
- if (defaults_use_hostname_for_mounts())
- return 1;
-
/* Use closest hosts to choose NFS version */
first = *list;
@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list,
first = last;
this = first;
+ prev = NULL;
while (this) {
struct host *next = this->next;
if (!this->name) {
remove_host(list, this);
add_host(&new, this);
+ } else if (defaults_use_hostname_for_mounts() && prev &&
+ prev->ent_num == this->ent_num) {
+ /* When we use the hostname to mount, there is no
+ * point in probing every address it has, just one is
+ * enough. Skip the rest.
+ */
} else {
status = get_supported_ver_and_cost(logopt, this,
selected_version, port);
@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list,
this->version = selected_version;
remove_host(list, this);
add_host(&new, this);
+ prev = this;
}
}
this = next;
@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list,
}
static int add_new_host(struct host **list,
- const char *host, unsigned int weight,
+ const char *host, int ent_num, unsigned int weight,
struct addrinfo *host_addr,
unsigned int rr, unsigned int options)
{
@@ -940,7 +943,7 @@ static int add_new_host(struct host **list,
else
return 0;
- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options);
+ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options);
if (!new)
return 0;
@@ -953,7 +956,7 @@ static int add_new_host(struct host **list,
return 1;
}
-static int add_host_addrs(struct host **list, const char *host,
+static int add_host_addrs(struct host **list, const char *host, int ent_num,
unsigned int weight, unsigned int options)
{
struct addrinfo hints, *ni, *this;
@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host,
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, 0, options);
+ ret = add_new_host(list, host, ent_num, weight, this, 0, options);
if (!ret)
break;
this = this->ai_next;
@@ -1027,7 +1030,7 @@ try_name:
rr++;
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, rr, options);
+ ret = add_new_host(list, host, ent_num, weight, this, rr, options);
if (!ret)
break;
this = this->ai_next;
@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts,
{
char *str, *p, *delim;
unsigned int empty = 1;
+ int ent_num = 1;
if (!list)
return 0;
@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts,
}
if (p != delim) {
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
if (empty) {
p = next;
continue;
@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts,
*delim = '\0';
next = delim + 1;
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
p = next;
continue;
}
@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts,
return 0;
}
+ ent_num++;
p = next;
}

View File

@ -0,0 +1,39 @@
autofs-5.1.5 - add NULL check for get_addr_string() return
From: Ian Kent <raven@themaw.net>
When constructing the mount location string in mount_nfs.c:mount_mount()
the return from get_addr_string() is not checked for NULL.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_nfs.c | 6 ++++++
2 files changed, 7 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -45,6 +45,7 @@ xx/xx/2018 autofs-5.1.5
- move close stdio descriptors to become_daemon().
- add systemd service command line option.
- support strictexpire mount option.
+- add NULL check for get_addr_string() return.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/mount_nfs.c
+++ autofs-5.1.4/modules/mount_nfs.c
@@ -333,7 +333,13 @@ dont_probe:
socklen_t len = INET6_ADDRSTRLEN;
char n_buf[len + 1];
const char *n_addr;
+
n_addr = get_addr_string(this->addr, n_buf, len);
+ if (!n_addr) {
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ error(ap->logopt, "get_addr_string: %s", estr);
+ goto forced_fail;
+ }
loc = malloc(strlen(n_addr) + strlen(this->path) + 4);
if (!loc) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);

View File

@ -0,0 +1,155 @@
autofs-5.1.5 - add config option for "ignore" mount option
From: Ian Kent <raven@themaw.net>
Add a configuration option to control whether the autofs pseudo
mount option is used on autofs mounts.
The default setting is "no" to avoid unexpected behaviour and
so is an opt-in setting for those who understand that, if user
space utilities and libraries honour this, then autofs mounts
will be ommitted from mount table listings.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/defaults.h | 2 ++
lib/defaults.c | 17 +++++++++++++++++
lib/master.c | 3 ++-
man/autofs.conf.5.in | 7 +++++++
redhat/autofs.conf.default.in | 9 +++++++++
samples/autofs.conf.default.in | 9 +++++++++
7 files changed, 47 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -62,6 +62,7 @@ xx/xx/2018 autofs-5.1.5
- fix unlink_mount_tree() not umounting mounts.
- add ignore mount option.
- use ignore option for offset mounts as well.
+- add config option for "ignore" mount option
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/defaults.h
+++ autofs-5.1.4/include/defaults.h
@@ -51,6 +51,7 @@
#define DEFAULT_USE_HOSTNAME_FOR_MOUNTS "0"
#define DEFAULT_DISABLE_NOT_FOUND_MESSAGE "0"
+#define DEFAULT_USE_IGNORE_MOUNT_OPTION "0"
#define DEFAULT_SSS_MASTER_MAP_WAIT "0"
#define DEFAULT_USE_MOUNT_REQUEST_LOG_ID "0"
@@ -174,6 +175,7 @@ const char *defaults_get_auth_conf_file(
unsigned int defaults_get_map_hash_table_size(void);
unsigned int defaults_use_hostname_for_mounts(void);
unsigned int defaults_disable_not_found_message(void);
+unsigned int defaults_get_use_ignore_mount_option(void);
unsigned int defaults_get_sss_master_map_wait(void);
unsigned int defaults_get_use_mount_request_log_id(void);
--- autofs-5.1.4.orig/lib/defaults.c
+++ autofs-5.1.4/lib/defaults.c
@@ -77,6 +77,7 @@
#define NAME_USE_HOSTNAME_FOR_MOUNTS "use_hostname_for_mounts"
#define NAME_DISABLE_NOT_FOUND_MESSAGE "disable_not_found_message"
+#define NAME_USE_IGNORE_MOUNT_OPTION "use_ignore_mount_option"
#define NAME_SSS_MASTER_MAP_WAIT "sss_master_map_wait"
#define NAME_USE_MOUNT_REQUEST_LOG_ID "use_mount_request_log_id"
@@ -364,6 +365,11 @@ static int conf_load_autofs_defaults(voi
if (ret == CFG_FAIL)
goto error;
+ ret = conf_update(sec, NAME_USE_IGNORE_MOUNT_OPTION,
+ DEFAULT_USE_IGNORE_MOUNT_OPTION, CONF_ENV);
+ if (ret == CFG_FAIL)
+ goto error;
+
ret = conf_update(sec, NAME_SSS_MASTER_MAP_WAIT,
DEFAULT_SSS_MASTER_MAP_WAIT, CONF_ENV);
if (ret == CFG_FAIL)
@@ -1863,6 +1869,17 @@ unsigned int defaults_disable_not_found_
return res;
}
+
+unsigned int defaults_get_use_ignore_mount_option(void)
+{
+ int res;
+
+ res = conf_get_yesno(autofs_gbl_sec, NAME_USE_IGNORE_MOUNT_OPTION);
+ if (res < 0)
+ res = atoi(DEFAULT_USE_IGNORE_MOUNT_OPTION);
+
+ return res;
+}
unsigned int defaults_get_sss_master_map_wait(void)
{
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -101,7 +101,8 @@ int master_add_autofs_point(struct maste
ap->negative_timeout = global_negative_timeout;
ap->exp_timeout = defaults_get_timeout();
ap->exp_runfreq = 0;
- ap->flags = MOUNT_FLAG_IGNORE;
+ if (defaults_get_use_ignore_mount_option())
+ ap->flags = MOUNT_FLAG_IGNORE;
if (ghost)
ap->flags |= MOUNT_FLAG_GHOST;
--- autofs-5.1.4.orig/man/autofs.conf.5.in
+++ autofs-5.1.4/man/autofs.conf.5.in
@@ -151,6 +151,13 @@ That produces, IMHO, unnecessary noise i
has been added to provide the ability to turn it off. The default is "no"
to maintain the current behaviour.
.TP
+.B use_ignore_mount_option
+.br
+An option to enable the use of autofs pseudo option "disable". This option
+is used as a hint to user space that the mount entry should be ommitted from
+mount table listings. The default is "no" to avoid unexpected changes in
+behaviour and so is an opt-in setting.
+.TP
.B sss_master_map_wait
.br
Set the time to wait and retry if sssd returns "no such entry" when starting
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
+++ autofs-5.1.4/redhat/autofs.conf.default.in
@@ -183,6 +183,15 @@ mount_nfs_default_protocol = 4
#
#disable_not_found_message = "no"
#
+# use_ignore_mount_option - This option is used to enable the use of autofs
+# pseudo option "disable". This option is used as a
+# hint to user space that the mount entry should be
+# ommitted from mount table listings. The default is
+# "no" to avoid unexpected changes in behaviour and
+# so is an opt-in setting.
+#
+#use_ignore_mount_option = no
+#
# sss_master_map_wait - When sssd is starting up it can sometimes return
# "no such entry" for a short time until it has read
# in the LDAP map information. Internal default is 0
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
+++ autofs-5.1.4/samples/autofs.conf.default.in
@@ -182,6 +182,15 @@ browse_mode = no
#
#disable_not_found_message = "no"
#
+# use_ignore_mount_option - This option is used to enable the use of autofs
+# pseudo option "disable". This option is used as a
+# hint to user space that the mount entry should be
+# ommitted from mount table listings. The default is
+# "no" to avoid unexpected changes in behaviour and
+# so is an opt-in setting.
+#
+#use_ignore_mount_option = no
+#
# sss_master_map_wait - When sssd is starting up it can sometimes return
# "no such entry" for a short time until it has read
# in the LDAP map information. Internal default is 0

View File

@ -0,0 +1,127 @@
autofs-5.1.5 - add glibc getmntent_r()
From: Ian Kent <raven@themaw.net>
Add a slightly modified version of the glibc getmntent_r() function
so autofs can read the proc mount table directly.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
lib/mounts.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -66,6 +66,7 @@ xx/xx/2018 autofs-5.1.5
- use bit flags for autofs mount types in mnt_list.
- use mp instead of path in mnt_list entries.
- always use PROC_MOUNTS to make mount lists.
+- add glibc getmntent_r().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -786,6 +786,101 @@ done:
return ret;
}
+/* From glibc decode_name() */
+/* Since the values in a line are separated by spaces, a name cannot
+ * contain a space. Therefore some programs encode spaces in names
+ * by the strings "\040". We undo the encoding when reading an entry.
+ * The decoding happens in place.
+ */
+static char *local_decode_name(char *buf)
+{
+ char *rp = buf;
+ char *wp = buf;
+
+ do {
+ if (rp[0] == '\\' && rp[1] == '0' &&
+ rp[2] == '4' && rp[3] == '0') {
+ /* \040 is a SPACE. */
+ *wp++ = ' ';
+ rp += 3;
+ } else if (rp[0] == '\\' && rp[1] == '0' &&
+ rp[2] == '1' && rp[3] == '1') {
+ /* \011 is a TAB. */
+ *wp++ = '\t';
+ rp += 3;
+ } else if (rp[0] == '\\' && rp[1] == '0' &&
+ rp[2] == '1' && rp[3] == '2') {
+ /* \012 is a NEWLINE. */
+ *wp++ = '\n';
+ rp += 3;
+ } else if (rp[0] == '\\' && rp[1] == '\\') {
+ /*
+ * We have to escape \\ to be able to represent
+ * all characters.
+ */
+ *wp++ = '\\';
+ rp += 1;
+ } else if (rp[0] == '\\' && rp[1] == '1' &&
+ rp[2] == '3' && rp[3] == '4') {
+ /* \134 is also \\. */
+ *wp++ = '\\';
+ rp += 3;
+ } else
+ *wp++ = *rp;
+ } while (*rp++ != '\0');
+
+ return buf;
+}
+
+/* From glibc getmntent_r() */
+static struct mntent *
+local_getmntent_r(FILE *tab, struct mntent *mnt, char *buf, int size)
+{
+ char *cp, *head;
+
+ do {
+ char *end_ptr;
+
+ if (fgets(buf, size, tab) == NULL)
+ return 0;
+
+ end_ptr = strchr(buf, '\n');
+ if (end_ptr != NULL) {
+ while (end_ptr[-1] == ' ' || end_ptr[-1] == '\t')
+ end_ptr--;
+ *end_ptr = '\0';
+ } else {
+ /* Whole line was not read. Do it now but forget it. */
+ char tmp[1024];
+ while (fgets(tmp, sizeof tmp, tab) != NULL)
+ if (strchr(tmp, '\n') != NULL)
+ break;
+ }
+
+ head = buf + strspn(buf, " \t");
+ /* skip empty lines and comment lines */
+ } while (head[0] == '\0' || head[0] == '#');
+
+ cp = strsep(&head, " \t");
+ mnt->mnt_fsname = cp != NULL ? local_decode_name(cp) : (char *) "";
+ if (head)
+ head += strspn(head, " \t");
+ cp = strsep(&head, " \t");
+ mnt->mnt_dir = cp != NULL ? local_decode_name (cp) : (char *) "";
+ if (head)
+ head += strspn(head, " \t");
+ cp = strsep(&head, " \t");
+ mnt->mnt_type = cp != NULL ? local_decode_name (cp) : (char *) "";
+ if (head)
+ head += strspn (head, " \t");
+ cp = strsep (&head, " \t");
+ mnt->mnt_opts = cp != NULL ? local_decode_name (cp) : (char *) "";
+
+ /* autofs doesn't need freq or passno */
+
+ return mnt;
+}
+
/*
* Get list of mounts under path in longest->shortest order
*/

View File

@ -0,0 +1,90 @@
autofs-5.1.5 - add ignore mount option
From: Ian Kent <raven@themaw.net>
Add mount option "ignore", if the kernel supports it, as an
indicator to applications to ignore the mount entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 10 ++++++++++
daemon/indirect.c | 10 ++++++++++
include/automount.h | 3 +++
lib/master.c | 4 ++--
5 files changed, 26 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -424,6 +424,16 @@ int do_mount_autofs_direct(struct autofs
mp->options = tmp;
}
}
+
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
+ if (tmp) {
+ strcat(tmp, ",ignore");
+ mp->options = tmp;
+ }
+ }
}
/* In case the directory doesn't exist, try to mkdir it */
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -133,6 +133,16 @@ static int do_mount_autofs_indirect(stru
}
}
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(options, strlen(options) + 7);
+ if (tmp) {
+ strcat(tmp, ",ignore");
+ options = tmp;
+ }
+ }
+
/* In case the directory doesn't exist, try to mkdir it */
if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -556,6 +556,9 @@ struct kernel_mod_version {
/* Use strict expire semantics if requested and kernel supports it */
#define MOUNT_FLAG_STRICTEXPIRE 0x0400
+/* Indicator for applications to ignore the mount entry */
+#define MOUNT_FLAG_IGNORE 0x0800
+
struct autofs_point {
pthread_t thid;
char *path; /* Mount point name */
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -101,9 +101,9 @@ int master_add_autofs_point(struct maste
ap->negative_timeout = global_negative_timeout;
ap->exp_timeout = defaults_get_timeout();
ap->exp_runfreq = 0;
- ap->flags = 0;
+ ap->flags = MOUNT_FLAG_IGNORE;
if (ghost)
- ap->flags = MOUNT_FLAG_GHOST;
+ ap->flags |= MOUNT_FLAG_GHOST;
if (nobind)
ap->flags |= MOUNT_FLAG_NOBIND;
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -60,6 +60,7 @@ xx/xx/2018 autofs-5.1.5
- remove a couple of old debug messages.
- fix amd entry memory leak.
- fix unlink_mount_tree() not umounting mounts.
+- add ignore mount option.
19/12/2017 autofs-5.1.4
- fix spec file url.

View File

@ -0,0 +1,174 @@
autofs-5.1.5 - add mount_verbose configuration option
From: Lars R. Damerow <lars@pixar.com>
This option makes automount pass the -v flag to mount(8).
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 20 ++++++++++++--------
include/defaults.h | 2 ++
lib/defaults.c | 17 +++++++++++++++++
man/autofs.conf.5.in | 4 ++++
redhat/autofs.conf.default.in | 4 ++++
samples/autofs.conf.default.in | 4 ++++
7 files changed, 44 insertions(+), 8 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -47,6 +47,7 @@ xx/xx/2018 autofs-5.1.5
- support strictexpire mount option.
- add NULL check for get_addr_string() return.
- use malloc(3) in spawn.c.
+- add mount_verbose configuration option.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/spawn.c
+++ autofs-5.1.4/daemon/spawn.c
@@ -558,12 +558,14 @@ int spawn_mount(unsigned logopt, ...)
char prog[] = PATH_MOUNT;
char arg0[] = PATH_MOUNT;
char argn[] = "-n";
+ char argvr[] = "-v";
/* In case we need to use the fake option to mount */
char arg_fake[] = "-f";
unsigned int options;
unsigned int retries = MTAB_LOCK_RETRIES;
int update_mtab = 1, ret, printed = 0;
unsigned int wait = defaults_get_mount_wait();
+ int verbose = defaults_get_mount_verbose();
char buf[PATH_MAX + 1];
unsigned int argv_len;
@@ -590,8 +592,10 @@ int spawn_mount(unsigned logopt, ...)
}
}
- /* Alloc 1 extra slot in case we need to use the "-f" option */
- argv_len = sizeof(char *) * (argc + 2);
+ /* Alloc 2 extra slots in case we need to use the "-f" or "-v" options
+ * plus the NULL slot for end of args.
+ */
+ argv_len = sizeof(char *) * (argc + 3);
argv = malloc(argv_len);
if (!argv) {
char buf[MAX_ERR_BUF];
@@ -604,12 +608,12 @@ int spawn_mount(unsigned logopt, ...)
argv[0] = arg0;
va_start(arg, logopt);
- if (update_mtab)
- p = argv + 1;
- else {
- argv[1] = argn;
- p = argv + 2;
- }
+ p = argv + 1;
+ if (!update_mtab)
+ *(p++) = argn;
+ if (verbose)
+ *(p++) = argvr;
+
while ((*p = va_arg(arg, char *))) {
if (options == SPAWN_OPT_OPEN && !strcmp(*p, "-t")) {
*(++p) = va_arg(arg, char *);
--- autofs-5.1.4.orig/include/defaults.h
+++ autofs-5.1.4/include/defaults.h
@@ -27,6 +27,7 @@
#define DEFAULT_TIMEOUT "600"
#define DEFAULT_MASTER_WAIT "10"
#define DEFAULT_NEGATIVE_TIMEOUT "60"
+#define DEFAULT_MOUNT_VERBOSE "0"
#define DEFAULT_MOUNT_WAIT "-1"
#define DEFAULT_UMOUNT_WAIT "12"
#define DEFAULT_BROWSE_MODE "1"
@@ -166,6 +167,7 @@ unsigned int defaults_get_ldap_timeout(v
unsigned int defaults_get_ldap_network_timeout(void);
unsigned int defaults_get_mount_nfs_default_proto(void);
unsigned int defaults_get_append_options(void);
+unsigned int defaults_get_mount_verbose(void);
unsigned int defaults_get_mount_wait(void);
unsigned int defaults_get_umount_wait(void);
const char *defaults_get_auth_conf_file(void);
--- autofs-5.1.4.orig/lib/defaults.c
+++ autofs-5.1.4/lib/defaults.c
@@ -68,6 +68,7 @@
#define NAME_MOUNT_NFS_DEFAULT_PROTOCOL "mount_nfs_default_protocol"
#define NAME_APPEND_OPTIONS "append_options"
+#define NAME_MOUNT_VERBOSE "mount_verbose"
#define NAME_MOUNT_WAIT "mount_wait"
#define NAME_UMOUNT_WAIT "umount_wait"
#define NAME_AUTH_CONF_FILE "auth_conf_file"
@@ -328,6 +329,11 @@ static int conf_load_autofs_defaults(voi
if (ret == CFG_FAIL)
goto error;
+ ret = conf_update(sec, NAME_MOUNT_VERBOSE,
+ DEFAULT_MOUNT_VERBOSE, CONF_ENV);
+ if (ret == CFG_FAIL)
+ goto error;
+
ret = conf_update(sec, NAME_MOUNT_WAIT,
DEFAULT_MOUNT_WAIT, CONF_ENV);
if (ret == CFG_FAIL)
@@ -1780,6 +1786,17 @@ unsigned int defaults_get_append_options
return res;
}
+
+unsigned int defaults_get_mount_verbose(void)
+{
+ long res;
+
+ res = conf_get_yesno(autofs_gbl_sec, NAME_MOUNT_VERBOSE);
+ if (res < 0)
+ res = atoi(DEFAULT_MOUNT_VERBOSE);
+
+ return res;
+}
unsigned int defaults_get_mount_wait(void)
{
--- autofs-5.1.4.orig/man/autofs.conf.5.in
+++ autofs-5.1.4/man/autofs.conf.5.in
@@ -41,6 +41,10 @@ Set the default timeout for caching fail
60). If the equivalent command line option is given it will override this
setting.
.TP
+.B mount_verbose
+.br
+Use the verbose flag when spawning mount(8) (program default "no").
+.TP
.B mount_wait
.br
Set the default time to wait for a response from a spawned mount(8)
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
+++ autofs-5.1.4/redhat/autofs.conf.default.in
@@ -26,6 +26,10 @@ timeout = 300
#
#negative_timeout = 60
#
+# mount_verbose - use the -v flag when calling mount(8).
+#
+#mount_verbose = no
+#
# mount_wait - time to wait for a response from mount(8).
# Setting this timeout can cause problems when
# mount would otherwise wait for a server that
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
+++ autofs-5.1.4/samples/autofs.conf.default.in
@@ -26,6 +26,10 @@ timeout = 300
#
#negative_timeout = 60
#
+# mount_verbose - use the -v flag when calling mount(8).
+#
+#mount_verbose = no
+#
# mount_wait - time to wait for a response from mount(8).
# Setting this timeout can cause problems when
# mount would otherwise wait for a server that

View File

@ -0,0 +1,200 @@
autofs-5.1.5 - support strictexpire mount option
From: Ian Kent <raven@themaw.net>
Kernel commit 092a53452b (("autofs: take more care to not update
last_used on path walk") helped to (partially) resolve a problem
where automounts were not expiring due to aggressive accesses from
user space.
This patch was later reverted because, for very large environments,
it meant more mount requests from clients and when there are a lot
of clients this caused a fairly significant increase in server load.
But there is a need for both types of expire check, depending on use
case, so a mount option to allow for strict update of last use of
autofs dentrys has been added ito the autofs file system (which just
means not updating the last use on path walk accesses).
So add support for this master map mount entry option in the user
space code.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 10 ++++++++++
daemon/indirect.c | 10 ++++++++++
include/automount.h | 3 +++
lib/master_parse.y | 8 +++++++-
lib/master_tok.l | 1 +
man/auto.master.5.in | 8 ++++++++
modules/mount_autofs.c | 5 +++++
8 files changed, 45 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -44,6 +44,7 @@ xx/xx/2018 autofs-5.1.5
- use flags for startup boolean options.
- move close stdio descriptors to become_daemon().
- add systemd service command line option.
+- support strictexpire mount option.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -421,6 +421,16 @@ int do_mount_autofs_direct(struct autofs
mp->options = make_options_string(ap->path, ap->kpipefd, str_direct);
if (!mp->options)
return 0;
+
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(mp->options, strlen(mp->options) + 12);
+ if (tmp) {
+ strcat(tmp, ",strictexpire");
+ mp->options = tmp;
+ }
+ }
}
/* In case the directory doesn't exist, try to mkdir it */
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -132,6 +132,16 @@ static int do_mount_autofs_indirect(stru
goto out_err;
}
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(options, strlen(options) + 12);
+ if (tmp) {
+ strcat(tmp, ",strictexpire");
+ options = tmp;
+ }
+ }
+
/* In case the directory doesn't exist, try to mkdir it */
if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -553,6 +553,9 @@ struct kernel_mod_version {
#define MOUNT_FLAG_SLAVE 0x0100
#define MOUNT_FLAG_PRIVATE 0x0200
+/* Use strict expire semantics if requested and kernel supports it */
+#define MOUNT_FLAG_STRICTEXPIRE 0x0400
+
struct autofs_point {
pthread_t thid;
char *path; /* Mount point name */
--- autofs-5.1.4.orig/lib/master_parse.y
+++ autofs-5.1.4/lib/master_parse.y
@@ -58,6 +58,7 @@ static char *format;
static long timeout;
static long negative_timeout;
static unsigned symlnk;
+static unsigned strictexpire;
static unsigned slave;
static unsigned private;
static unsigned nobind;
@@ -105,7 +106,7 @@ static int master_fprintf(FILE *, char *
%token MAP
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE
-%token OPT_SLAVE OPT_PRIVATE
+%token OPT_STRICTEXPIRE OPT_SLAVE OPT_PRIVATE
%token COLON COMMA NL DDASH
%type <strtype> map
%type <strtype> options
@@ -206,6 +207,7 @@ line:
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
+ | PATH OPT_STRICTEXPIRE { master_notify($1); YYABORT; }
| PATH OPT_SLAVE { master_notify($1); YYABORT; }
| PATH OPT_PRIVATE { master_notify($1); YYABORT; }
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
@@ -619,6 +621,7 @@ option: daemon_option
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
| OPT_SYMLINK { symlnk = 1; }
+ | OPT_STRICTEXPIRE { strictexpire = 1; }
| OPT_SLAVE { slave = 1; }
| OPT_PRIVATE { private = 1; }
| OPT_NOBIND { nobind = 1; }
@@ -693,6 +696,7 @@ static void local_init_vars(void)
timeout = -1;
negative_timeout = 0;
symlnk = 0;
+ strictexpire = 0;
slave = 0;
private = 0;
nobind = 0;
@@ -901,6 +905,8 @@ int master_parse_entry(const char *buffe
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY;
if (symlnk)
entry->ap->flags |= MOUNT_FLAG_SYMLINK;
+ if (strictexpire)
+ entry->ap->flags |= MOUNT_FLAG_STRICTEXPIRE;
if (slave)
entry->ap->flags |= MOUNT_FLAG_SLAVE;
if (private)
--- autofs-5.1.4.orig/lib/master_tok.l
+++ autofs-5.1.4/lib/master_tok.l
@@ -391,6 +391,7 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTW
-?nobrowse { return(OPT_NOGHOST); }
-?slave { return(OPT_SLAVE); }
-?private { return(OPT_PRIVATE); }
+ -?strictexpire { return(OPT_STRICTEXPIRE); }
-g|--ghost|-?browse { return(OPT_GHOST); }
-v|--verbose { return(OPT_VERBOSE); }
-d|--debug { return(OPT_DEBUG); }
--- autofs-5.1.4.orig/man/auto.master.5.in
+++ autofs-5.1.4/man/auto.master.5.in
@@ -199,6 +199,14 @@ entries only, either in the master map (
or with individual map entries. The option is ignored for direct mounts
and non-root offest mount entries.
.TP
+.I "strictexpire"
+Use a strict expire policy for this automount. Using this option means
+that last use of autofs directory entries will not be updated during
+path walks so that mounts in an automount won't be kept mounted by
+applications scanning the mount tree. Note that this doesn't completely
+resolve the problem of expired automounts being immediately re-mounted
+due to application accesses triggered by the expire itself.
+.TP
.I slave \fPor\fI private
This option allows mount propagation of bind mounts to be set to
either \fIslave\fP or \fIprivate\fP. This option may be needed when using
--- autofs-5.1.4.orig/modules/mount_autofs.c
+++ autofs-5.1.4/modules/mount_autofs.c
@@ -57,6 +57,7 @@ int mount_mount(struct autofs_point *ap,
int nobind = ap->flags & MOUNT_FLAG_NOBIND;
int ghost = ap->flags & MOUNT_FLAG_GHOST;
int symlnk = ap->flags & MOUNT_FLAG_SYMLINK;
+ int strictexpire = ap->flags & MOUNT_FLAG_STRICTEXPIRE;
time_t timeout = get_exp_timeout(ap, ap->entry->maps);
unsigned logopt = ap->logopt;
struct map_type_info *info;
@@ -131,6 +132,8 @@ int mount_mount(struct autofs_point *ap,
ghost = 1;
else if (_strncmp("symlink", cp, 7) == 0)
symlnk = 1;
+ else if (_strncmp("strictexpire", cp, 12) == 0)
+ strictexpire = 1;
else if (_strncmp("hosts", cp, 5) == 0)
hosts = 1;
else if (_strncmp("timeout=", cp, 8) == 0) {
@@ -173,6 +176,8 @@ int mount_mount(struct autofs_point *ap,
nap->parent = ap;
if (symlnk)
nap->flags |= MOUNT_FLAG_SYMLINK;
+ if (strictexpire)
+ nap->flags |= MOUNT_FLAG_STRICTEXPIRE;
if (hosts)
argc = 0;

View File

@ -0,0 +1,34 @@
autofs-5.1.5 - allow period following macro in selector value
From: Ian Kent <raven@themaw.net>
If a ${} macro is used in a selector (such as hostd) the parser doesn't
permit a period to follow it (such as when the value is a host name).
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/amd_tok.l | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -51,6 +51,7 @@ xx/xx/2018 autofs-5.1.5
- optionally log mount requestor process info.
- log mount call arguments if mount_verbose is set.
- make expire remaining log level debug.
+- allow period following macro in selector value.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/amd_tok.l
+++ autofs-5.1.4/modules/amd_tok.l
@@ -95,7 +95,7 @@ V6MASK (12[0-8]|1[0-1][0-9]|[1-9][0-9]|
FOPT (({QSTR}|{FSTR}|{MACRO})+)
OPTS ({OSTR}(=({VSTR}|{MACRO})+)?)
-SOPT (({SSTR}|{QSTR}|{MACRO})+)
+SOPT ({SSTR}|{QSTR}|{MACRO}(\.|{SSTR}|{QSTR}|{MACRO})+)
NOPT ({SSTR}|(({IP4ADDR}(\/{V4MASK})?)|({IP6ADDR}(\/{V6MASK})?)))
MAPOPT (fs|type|maptype|pref|sublink|cache)

View File

@ -0,0 +1,42 @@
autofs-5.1.5 - also use strictexpire for offsets
From: Ian Kent <raven@themaw.net>
Map entries with offsets should use the "strictexpire" option when
mounting offsets if the option is set for the owner mount.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 10 ++++++++++
2 files changed, 11 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -53,6 +53,7 @@ xx/xx/2018 autofs-5.1.5
- make expire remaining log level debug.
- allow period following macro in selector value.
- fix macro expansion in selector values.
+- also use strictexpire for offsets.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -743,6 +743,16 @@ int mount_autofs_offset(struct autofs_po
mp->options = make_options_string(ap->path, ap->kpipefd, str_offset);
if (!mp->options)
return MOUNT_OFFSET_OK;
+
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(mp->options, strlen(mp->options) + 12);
+ if (tmp) {
+ strcat(tmp, ",strictexpire");
+ mp->options = tmp;
+ }
+ }
}
strcpy(mountpoint, root);

View File

@ -0,0 +1,405 @@
autofs-5.1.5 - always use PROC_MOUNTS to make mount lists
From: Ian Kent <raven@themaw.net>
If it's necessary to read a mount table then always use the proc file
system mount table.
This could be very inefficient for cases where the mtab (_PATH_MOUNTED)
is specified but the mtab has been a symlink to the proc mount tables
for quite a while now so it doesn't make any difference always using
the proc tables.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 6 +++---
daemon/direct.c | 14 +++++++-------
daemon/indirect.c | 8 ++++----
daemon/lookup.c | 4 ++--
daemon/spawn.c | 2 +-
daemon/state.c | 2 +-
include/mounts.h | 6 +++---
lib/mounts.c | 40 ++++++++++++++++++++--------------------
modules/parse_amd.c | 4 ++--
10 files changed, 44 insertions(+), 43 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -65,6 +65,7 @@ xx/xx/2018 autofs-5.1.5
- add config option for "ignore" mount option
- use bit flags for autofs mount types in mnt_list.
- use mp instead of path in mnt_list entries.
+- always use PROC_MOUNTS to make mount lists.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -333,7 +333,7 @@ static int walk_tree(const char *base, i
struct stat st, *pst = &st;
int ret;
- if (!is_mounted(_PATH_MOUNTED, base, MNTS_REAL))
+ if (!is_mounted(base, MNTS_REAL))
ret = lstat(base, pst);
else {
pst = NULL;
@@ -593,11 +593,11 @@ static int umount_subtree_mounts(struct
* If this is the root of a multi-mount we've had to umount
* it already to ensure it's ok to remove any offset triggers.
*/
- if (!is_mm_root && is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
+ if (!is_mm_root && is_mounted(path, MNTS_REAL)) {
struct amd_entry *entry;
debug(ap->logopt, "unmounting dir = %s", path);
if (umount_ent(ap, path) &&
- is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
+ is_mounted(path, MNTS_REAL)) {
warn(ap->logopt, "could not umount dir %s", path);
left++;
goto done;
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -207,7 +207,7 @@ int umount_autofs_direct(struct autofs_p
struct mnt_list *mnts;
struct mapent *me, *ne;
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
+ mnts = tree_make_mnt_tree("/");
pthread_cleanup_push(mnts_cleanup, mnts);
nc = ap->entry->master->nc;
cache_readlock(nc);
@@ -515,7 +515,7 @@ int mount_autofs_direct(struct autofs_po
return -1;
}
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
+ mnts = tree_make_mnt_tree("/");
pthread_cleanup_push(mnts_cleanup, mnts);
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
master_source_readlock(ap->entry);
@@ -583,7 +583,7 @@ int umount_autofs_offset(struct autofs_p
int opened = 0;
if (me->ioctlfd != -1) {
- if (is_mounted(_PATH_MOUNTED, me->key, MNTS_REAL)) {
+ if (is_mounted(me->key, MNTS_REAL)) {
error(ap->logopt,
"attempt to umount busy offset %s", me->key);
return 1;
@@ -591,7 +591,7 @@ int umount_autofs_offset(struct autofs_p
ioctlfd = me->ioctlfd;
} else {
/* offset isn't mounted, return success and try to recover */
- if (!is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
+ if (!is_mounted(me->key, MNTS_AUTOFS)) {
debug(ap->logopt,
"offset %s not mounted",
me->key);
@@ -707,7 +707,7 @@ int mount_autofs_offset(struct autofs_po
if (!(ret == -1 && errno == ENOENT))
return MOUNT_OFFSET_FAIL;
} else {
- if (is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
+ if (is_mounted(me->key, MNTS_AUTOFS)) {
if (ap->state != ST_READMAP)
warn(ap->logopt,
"trigger %s already mounted", me->key);
@@ -781,7 +781,7 @@ int mount_autofs_offset(struct autofs_po
* the kernel NFS client.
*/
if (me->multi != me &&
- is_mounted(_PROC_MOUNTS, mountpoint, MNTS_REAL))
+ is_mounted(mountpoint, MNTS_REAL))
return MOUNT_OFFSET_IGNORE;
/*
@@ -901,7 +901,7 @@ void *expire_proc_direct(void *arg)
left = 0;
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
+ mnts = tree_make_mnt_tree("/");
pthread_cleanup_push(mnts_cleanup, mnts);
/* Get a list of mounts select real ones and expire them if possible */
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -104,7 +104,7 @@ static int do_mount_autofs_indirect(stru
if (ret == 0)
return -1;
} else {
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 1);
+ mnts = get_mnt_list(ap->path, 1);
if (mnts) {
ret = unlink_mount_tree(ap, mnts);
free_mnt_list(mnts);
@@ -433,7 +433,7 @@ void *expire_proc_indirect(void *arg)
left = 0;
/* Get a list of real mounts and expire them if possible */
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 0);
+ mnts = get_mnt_list(ap->path, 0);
pthread_cleanup_push(mnts_cleanup, mnts);
for (next = mnts; next; next = next->next) {
char *ind_key;
@@ -454,7 +454,7 @@ void *expire_proc_indirect(void *arg)
struct stat st;
/* It's got a mount, deal with in the outer loop */
- if (is_mounted(_PATH_MOUNTED, next->mp, MNTS_REAL)) {
+ if (is_mounted(next->mp, MNTS_REAL)) {
pthread_setcancelstate(cur_state, NULL);
continue;
}
@@ -563,7 +563,7 @@ void *expire_proc_indirect(void *arg)
pthread_cleanup_pop(1);
count = offsets = submnts = 0;
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 0);
+ mnts = get_mnt_list(ap->path, 0);
pthread_cleanup_push(mnts_cleanup, mnts);
/* Are there any real mounts left */
for (next = mnts; next; next = next->next) {
--- autofs-5.1.4.orig/daemon/lookup.c
+++ autofs-5.1.4/daemon/lookup.c
@@ -1425,7 +1425,7 @@ void lookup_prune_one_cache(struct autof
valid = NULL;
}
if (!valid &&
- is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
+ is_mounted(path, MNTS_REAL)) {
debug(ap->logopt, "prune posponed, %s mounted", path);
free(key);
free(path);
@@ -1448,7 +1448,7 @@ void lookup_prune_one_cache(struct autof
if (valid)
cache_delete(mc, key);
- else if (!is_mounted(_PROC_MOUNTS, path, MNTS_AUTOFS)) {
+ else if (!is_mounted(path, MNTS_AUTOFS)) {
dev_t devid = ap->dev;
status = CHE_FAIL;
if (ap->type == LKP_DIRECT)
--- autofs-5.1.4.orig/daemon/spawn.c
+++ autofs-5.1.4/daemon/spawn.c
@@ -427,7 +427,7 @@ static int do_spawn(unsigned logopt, uns
if (!is_bind)
goto done;
- if (is_mounted(_PROC_MOUNTS, argv[loc], MNTS_AUTOFS)) {
+ if (is_mounted(argv[loc], MNTS_AUTOFS)) {
fprintf(stderr,
"error: can't bind to an autofs mount\n");
close(STDOUT_FILENO);
--- autofs-5.1.4.orig/daemon/state.c
+++ autofs-5.1.4/daemon/state.c
@@ -499,7 +499,7 @@ static void *do_readmap(void *arg)
struct mapent *me;
unsigned int append_alarm = !ap->exp_runfreq;
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
+ mnts = tree_make_mnt_tree("/");
pthread_cleanup_push(tree_mnts_cleanup, mnts);
nc = ap->entry->master->nc;
cache_readlock(nc);
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -99,11 +99,11 @@ char *make_mnt_name_string(char *path);
int ext_mount_add(struct list_head *, const char *, unsigned int);
int ext_mount_remove(struct list_head *, const char *);
int ext_mount_inuse(const char *);
-struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
+struct mnt_list *get_mnt_list(const char *path, int include);
void free_mnt_list(struct mnt_list *list);
-int is_mounted(const char *table, const char *mp, unsigned int type);
+int is_mounted(const char *mp, unsigned int type);
void tree_free_mnt_tree(struct mnt_list *tree);
-struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
+struct mnt_list *tree_make_mnt_tree(const char *path);
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
int tree_get_mnt_sublist(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
int tree_find_mnt_ents(struct mnt_list *mnts, struct list_head *list, const char *path);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -789,7 +789,7 @@ done:
/*
* Get list of mounts under path in longest->shortest order
*/
-struct mnt_list *get_mnt_list(const char *table, const char *path, int include)
+struct mnt_list *get_mnt_list(const char *path, int include)
{
FILE *tab;
size_t pathlen = strlen(path);
@@ -803,7 +803,7 @@ struct mnt_list *get_mnt_list(const char
if (!path || !pathlen || pathlen > PATH_MAX)
return NULL;
- tab = open_setmntent_r(table);
+ tab = open_setmntent_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
logerr("setmntent: %s", estr);
@@ -892,7 +892,7 @@ void free_mnt_list(struct mnt_list *list
}
}
-static int table_is_mounted(const char *table, const char *mp, unsigned int type)
+static int table_is_mounted(const char *mp, unsigned int type)
{
struct mntent *mnt;
struct mntent mnt_wrk;
@@ -904,7 +904,7 @@ static int table_is_mounted(const char *
if (!mp || !mp_len || mp_len >= PATH_MAX)
return 0;
- tab = open_setmntent_r(table);
+ tab = open_setmntent_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
logerr("setmntent: %s", estr);
@@ -938,7 +938,7 @@ static int table_is_mounted(const char *
return ret;
}
-static int ioctl_is_mounted(const char *table, const char *mp, unsigned int type)
+static int ioctl_is_mounted(const char *mp, unsigned int type)
{
struct ioctl_ops *ops = get_ioctl_ops();
unsigned int mounted;
@@ -949,7 +949,7 @@ static int ioctl_is_mounted(const char *
*/
ret = ops->ismountpoint(LOGOPT_NONE, -1, mp, &mounted);
if (ret == -1)
- return table_is_mounted(table, mp, type);
+ return table_is_mounted(mp, type);
if (mounted) {
switch (type) {
@@ -964,14 +964,14 @@ static int ioctl_is_mounted(const char *
return 0;
}
-int is_mounted(const char *table, const char *mp, unsigned int type)
+int is_mounted(const char *mp, unsigned int type)
{
struct ioctl_ops *ops = get_ioctl_ops();
if (ops->ismountpoint)
- return ioctl_is_mounted(table, mp, type);
+ return ioctl_is_mounted(mp, type);
else
- return table_is_mounted(table, mp, type);
+ return table_is_mounted(mp, type);
}
/*
@@ -1018,7 +1018,7 @@ void tree_free_mnt_tree(struct mnt_list
/*
* Make tree of system mounts in /proc/mounts.
*/
-struct mnt_list *tree_make_mnt_tree(const char *table, const char *path)
+struct mnt_list *tree_make_mnt_tree(const char *path)
{
FILE *tab;
struct mntent mnt_wrk;
@@ -1029,7 +1029,7 @@ struct mnt_list *tree_make_mnt_tree(cons
size_t plen;
int eq;
- tab = open_setmntent_r(table);
+ tab = open_setmntent_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
logerr("setmntent: %s", estr);
@@ -1281,7 +1281,7 @@ int tree_is_mounted(struct mnt_list *mnt
int mounted = 0;
if (ops->ismountpoint)
- return ioctl_is_mounted(_PROC_MOUNTS, path, type);
+ return ioctl_is_mounted(path, type);
INIT_LIST_HEAD(&list);
@@ -1856,7 +1856,7 @@ void set_indirect_mount_tree_catatonic(s
struct mapent_cache *mc;
struct mapent *me;
- if (!is_mounted(_PROC_MOUNTS, ap->path, MNTS_AUTOFS))
+ if (!is_mounted(ap->path, MNTS_AUTOFS))
return;
map = entry->maps;
@@ -1920,7 +1920,7 @@ int umount_ent(struct autofs_point *ap,
* so that we do not try to call rmdir_path on the
* directory.
*/
- if (!rv && is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
+ if (!rv && is_mounted(path, MNTS_REAL)) {
crit(ap->logopt,
"the umount binary reported that %s was "
"unmounted, but there is still something "
@@ -2053,7 +2053,7 @@ int mount_multi_triggers(struct autofs_p
*/
if (ap->state == ST_READMAP && ap->flags & MOUNT_FLAG_REMOUNT) {
if (oe->ioctlfd != -1 ||
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
+ is_mounted(oe->key, MNTS_REAL)) {
char oe_root[PATH_MAX + 1];
strcpy(oe_root, root);
strcat(oe_root, offset);
@@ -2142,7 +2142,7 @@ int umount_multi_triggers(struct autofs_
left += umount_multi_triggers(ap, oe, root, oe_base);
if (oe->ioctlfd != -1 ||
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
+ is_mounted(oe->key, MNTS_REAL)) {
left++;
continue;
}
@@ -2185,10 +2185,10 @@ int umount_multi_triggers(struct autofs_
* delete the offsets from the cache and we need to put
* the offset triggers back.
*/
- if (is_mounted(_PATH_MOUNTED, root, MNTS_REAL)) {
+ if (is_mounted(root, MNTS_REAL)) {
info(ap->logopt, "unmounting dir = %s", root);
if (umount_ent(ap, root) &&
- is_mounted(_PATH_MOUNTED, root, MNTS_REAL)) {
+ is_mounted(root, MNTS_REAL)) {
if (mount_multi_triggers(ap, me, root, strlen(root), "/") < 0)
warn(ap->logopt,
"failed to remount offset triggers");
@@ -2288,9 +2288,9 @@ int clean_stale_multi_triggers(struct au
* ESTALE errors when attempting list the directory.
*/
if (oe->ioctlfd != -1 ||
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
+ is_mounted(oe->key, MNTS_REAL)) {
if (umount_ent(ap, oe->key) &&
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
+ is_mounted(oe->key, MNTS_REAL)) {
debug(ap->logopt,
"offset %s has active mount, invalidate",
oe->key);
--- autofs-5.1.4.orig/modules/parse_amd.c
+++ autofs-5.1.4/modules/parse_amd.c
@@ -1173,7 +1173,7 @@ static int do_generic_mount(struct autof
* multiple times since they are outside of
* the automount filesystem.
*/
- if (!is_mounted(_PATH_MOUNTED, entry->fs, MNTS_REAL)) {
+ if (!is_mounted(entry->fs, MNTS_REAL)) {
ret = do_mount(ap, entry->fs, "/", 1,
target, entry->type, opts);
if (ret)
@@ -1223,7 +1223,7 @@ static int do_nfs_mount(struct autofs_po
target, entry->type, opts,
mount_nfs->context);
} else {
- if (!is_mounted(_PATH_MOUNTED, entry->fs, MNTS_REAL)) {
+ if (!is_mounted(entry->fs, MNTS_REAL)) {
ret = mount_nfs->mount_mount(ap, entry->fs, "/", 1,
target, entry->type, opts,
mount_nfs->context);

View File

@ -0,0 +1,172 @@
autofs-5.1.5 - don't use tree_is_mounted() for mounted checks
From: Ian Kent <raven@themaw.net>
Always use is_mounted() for mounted checks.
If the proc mount table actually needs to be used this could be
very inefficient but the miscelaneous device ioctl interface
has been available to quite a few years now so it really needs
to be used to avoid the scanning of mount tables.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 12 ++++--------
daemon/state.c | 4 ++--
include/automount.h | 2 +-
include/mounts.h | 1 -
lib/mounts.c | 40 ----------------------------------------
6 files changed, 8 insertions(+), 52 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -69,6 +69,7 @@ xx/xx/2018 autofs-5.1.5
- add glibc getmntent_r().
- use local getmntent_r in table_is_mounted().
- refactor unlink_active_mounts() in direct.c.
+- don't use tree_is_mounted() for mounted checks.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -82,7 +82,7 @@ static void mnts_cleanup(void *arg)
return;
}
-int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
+int do_umount_autofs_direct(struct autofs_point *ap, struct mapent *me)
{
struct ioctl_ops *ops = get_ioctl_ops();
char buf[MAX_ERR_BUF];
@@ -98,7 +98,7 @@ int do_umount_autofs_direct(struct autof
if (me->ioctlfd != -1) {
if (ap->state == ST_READMAP &&
- tree_is_mounted(mnts, me->key, MNTS_REAL)) {
+ is_mounted(me->key, MNTS_REAL)) {
error(ap->logopt,
"attempt to umount busy direct mount %s",
me->key);
@@ -204,11 +204,8 @@ int umount_autofs_direct(struct autofs_p
{
struct map_source *map;
struct mapent_cache *nc, *mc;
- struct mnt_list *mnts;
struct mapent *me, *ne;
- mnts = tree_make_mnt_tree("/");
- pthread_cleanup_push(mnts_cleanup, mnts);
nc = ap->entry->master->nc;
cache_readlock(nc);
pthread_cleanup_push(cache_lock_cleanup, nc);
@@ -233,7 +230,7 @@ int umount_autofs_direct(struct autofs_p
* catatonic regardless of the reason for the
* failed umount.
*/
- error = do_umount_autofs_direct(ap, mnts, me);
+ error = do_umount_autofs_direct(ap, me);
if (!error)
goto done;
@@ -246,7 +243,6 @@ done:
map = map->next;
}
pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
close(ap->state_pipe[0]);
close(ap->state_pipe[1]);
@@ -947,7 +943,7 @@ void *expire_proc_direct(void *arg)
}
/* It's got a mount, deal with in the outer loop */
- if (tree_is_mounted(mnts, me->key, MNTS_REAL)) {
+ if (is_mounted(me->key, MNTS_REAL)) {
pthread_setcancelstate(cur_state, NULL);
continue;
}
--- autofs-5.1.4.orig/daemon/state.c
+++ autofs-5.1.4/daemon/state.c
@@ -438,8 +438,8 @@ static void do_readmap_mount(struct auto
else
ap->exp_runfreq = runfreq;
}
- } else if (!tree_is_mounted(mnts, me->key, MNTS_REAL))
- do_umount_autofs_direct(ap, mnts, me);
+ } else if (!is_mounted(me->key, MNTS_REAL))
+ do_umount_autofs_direct(ap, me);
else
debug(ap->logopt,
"%s is mounted", me->key);
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -613,7 +613,7 @@ void submount_signal_parent(struct autof
void close_mount_fds(struct autofs_point *ap);
int umount_autofs(struct autofs_point *ap, const char *root, int force);
int umount_autofs_indirect(struct autofs_point *ap, const char *root);
-int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me);
+int do_umount_autofs_direct(struct autofs_point *ap, struct mapent *me);
int umount_autofs_direct(struct autofs_point *ap);
int umount_autofs_offset(struct autofs_point *ap, struct mapent *me);
int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_indirect_t *pkt);
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -107,7 +107,6 @@ struct mnt_list *tree_make_mnt_tree(cons
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
int tree_get_mnt_sublist(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
int tree_find_mnt_ents(struct mnt_list *mnts, struct list_head *list, const char *path);
-int tree_is_mounted(struct mnt_list *mnts, const char *path, unsigned int type);
void set_tsd_user_vars(unsigned int, uid_t, gid_t);
const char *mount_type_str(unsigned int);
void set_exp_timeout(struct autofs_point *ap, struct map_source *source, time_t timeout);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -1368,46 +1368,6 @@ int tree_find_mnt_ents(struct mnt_list *
return 0;
}
-int tree_is_mounted(struct mnt_list *mnts, const char *path, unsigned int type)
-{
- struct ioctl_ops *ops = get_ioctl_ops();
- struct list_head *p;
- struct list_head list;
- int mounted = 0;
-
- if (ops->ismountpoint)
- return ioctl_is_mounted(path, type);
-
- INIT_LIST_HEAD(&list);
-
- if (!tree_find_mnt_ents(mnts, &list, path))
- return 0;
-
- list_for_each(p, &list) {
- struct mnt_list *mptr;
-
- mptr = list_entry(p, struct mnt_list, entries);
-
- if (type) {
- if (type & MNTS_REAL) {
- if (mptr->flags & MNTS_AUTOFS) {
- mounted = 1;
- break;
- }
- } else if (type & MNTS_AUTOFS) {
- if (mptr->flags & MNTS_AUTOFS) {
- mounted = 1;
- break;
- }
- } else {
- mounted = 1;
- break;
- }
- }
- }
- return mounted;
-}
-
void set_tsd_user_vars(unsigned int logopt, uid_t uid, gid_t gid)
{
struct thread_stdenv_vars *tsv;

View File

@ -0,0 +1,383 @@
autofs-5.1.5 - fix additional typing errors
From: Andreas P <nurgrak@gmail.com>
Fix some more typing errors.
imk: added changes discussed on mailing list.
Signed-off-by: Andreas P <nurgrak@gmail.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
INSTALL | 2 +-
README.replicated-server | 2 +-
man/auto.master.5.in | 14 +++++++-------
man/autofs.5 | 9 ++++-----
man/autofs.conf.5.in | 29 ++++++++++++++---------------
man/autofs_ldap_auth.conf.5.in | 2 +-
man/automount.8 | 2 +-
modules/lookup_ldap.c | 4 ++--
modules/replicated.c | 4 ++--
redhat/autofs.conf.default.in | 14 +++++++-------
redhat/autofs.sysconfig | 2 +-
samples/autofs.conf.default.in | 10 +++++-----
13 files changed, 47 insertions(+), 48 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -113,6 +113,7 @@ xx/xx/2018 autofs-5.1.5
- simplify sss source stale check.
- use defines for expire type.
- remove unused function dump_master().
+- fix additional typing errors.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/INSTALL
+++ autofs-5.1.4/INSTALL
@@ -119,7 +119,7 @@ For example, Fedora Core 4 kernel packag
would use the 2.6.12 patch because it applies the 2.6.12 release
candidate revision 6 patch. But the autofs patch doesn't apply
because the rpm also applies a patch somewhere that changes one
-area the the patch also changes but this change is not present
+area the patch also changes but this change is not present
in the 2.6.12 release kernel.
On the other hand, Fedora Core 3 kernel 2.6.12-1.1381_FC3
--- autofs-5.1.4.orig/README.replicated-server
+++ autofs-5.1.4/README.replicated-server
@@ -34,7 +34,7 @@ the following selection rules.
- PROXIMITY_OTHER, host is on a network not directlty
reachable through a local interface.
-2) NFS version and protocol is selected by caclculating the largest
+2) NFS version and protocol is selected by calculating the largest
number of hosts supporting an NFS version and protocol that
have the closest proximity. These hosts are added to the list
in response time order. Hosts may have a corresponding weight
--- autofs-5.1.4.orig/man/auto.master.5.in
+++ autofs-5.1.4/man/auto.master.5.in
@@ -211,12 +211,12 @@ due to application accesses triggered by
This option allows mount propagation of bind mounts to be set to
either \fIslave\fP or \fIprivate\fP. This option may be needed when using
multi-mounts that have bind mounts that bind to a file system that is
-propagation shared. This is becuase the bind mount will have the same
+propagation shared. This is because the bind mount will have the same
properties as its target which causes problems for offset mounts. When
this happens an unwanted offset mount is propagated back to the target
file system resulting in a deadlock when attempting to access the offset.
-This option is a an autofs pseudo mount option that can be used in the
-master map only. By default bind mounts will inherit the mount propagation
+This option is an autofs pseudo mount option that can be used in the
+master map only. By default, bind mounts will inherit the mount propagation
of the target file system.
.TP
.I "\-r, \-\-random-multimount-selection"
@@ -261,7 +261,7 @@ accessing /net/myserver will mount expor
/net/myserver.
.P
NOTE: mounts done from a hosts map will be mounted with the "nosuid,nodev,intr" options
-unless overridden by explicily specifying the "suid", "dev" or "nointr" options in the
+unless overridden by explicitly specifying the "suid", "dev" or "nointr" options in the
master map entry.
.SH LDAP MAPS
If the map type \fBldap\fP is specified the mapname is of the form
@@ -277,7 +277,7 @@ configuration, in which case the map nam
.P
If no schema is set in the autofs configuration then autofs will check
each of the commonly used schema for a valid entry and if one is found
-it will used for subsequent lookups.
+it will be used for subsequent lookups.
.P
There are three common schemas in use:
.TP
@@ -351,7 +351,7 @@ connection is to be used then the client
locations must also be configured within the LDAP client.
.P
In OpenLDAP these may be configured in the \fBldap.conf\fP file or in the
-per-user configuration. For example it may be sensible to use the system
+per-user configuration. For example, it may be sensible to use the system
wide configuration for the location of the Certificate Authority certificate
and set the location of the client certificate and private key
in the per-user configuration. The location of these files and the configuration
@@ -399,5 +399,5 @@ configuration will be used to locate the
.BR autofs_ldap_auth.conf (5).
.SH AUTHOR
This manual page was written by Christoph Lameter <chris@waterf.org>,
-for the Debian GNU/Linux system. Edited by <hpa@transmeta.com> and
+for the Debian GNU/Linux system. Edited by <hpa@transmeta.com> and
Ian Kent <raven@themaw.net> .
--- autofs-5.1.4.orig/man/autofs.5
+++ autofs-5.1.4/man/autofs.5
@@ -64,7 +64,6 @@ can't be mounted.
.br
is used to make the weight the sole factor in selecting a server when multiple
servers are present in a map entry.
-and
.TP
.B \-no-use-weight-only
.br
@@ -192,7 +191,7 @@ SHOST Short hostname (domain part remove
.sp
If a program map is used these standard environment variables will have
a prefix of "AUTOFS_" to prevent interpreted languages like python from
-being able to load and execute arbitray code from a user home directory.
+being able to load and execute arbitrary code from a user home directory.
.RE
.sp
Additional entries can be defined with the \-Dvariable=Value map-option to
@@ -293,10 +292,10 @@ may be negated with the \fB!\fP.
For a \fBlocation\fP to be selected for a mount attempt all of its \fBselectors\fP
must evaluate to true. If a \fBlocation\fP is selected for a mount attempt
and succeeds the lookup is completed and returns success. If the mount
-attempt fails the proceedure continues with the next \fBlocation\fP until
+attempt fails the procedure continues with the next \fBlocation\fP until
they have all been tried.
-In addition some \fBselectors\fP take no argumenets, some one argument
+In addition, some \fBselectors\fP take no arguments, some one argument
and others optionally take two arguments.
The \fBselectors\fP that take no arguments are:
@@ -584,7 +583,7 @@ In the first line we have an NFS remote
another nfs mount for the exported directory /work/util from host zeus.
This would be mounted on /test/util.
-Finally we have an example of the use of the \fBsublink\fP option. In
+Finally, we have an example of the use of the \fBsublink\fP option. In
this case the filesystem bilbo:/shared would be mounted on a path
external the automount directory (under the direcory given by
configuration option auto_dir) and the path /test/local either
--- autofs-5.1.4.orig/man/autofs.conf.5.in
+++ autofs-5.1.4/man/autofs.conf.5.in
@@ -91,7 +91,7 @@ set default log level "none", "verbose"
.B force_standard_program_map_env
.br
override the use of a prefix with standard environment variables when a
-program map is executed. Since program maps are run as the privileded
+program map is executed. Since program maps are run as the privileged
user setting these standard environment variables opens automount(8) to
potential user privilege escalation when the program map is written in a
language that can load components from, for example, a user home directory
@@ -110,16 +110,15 @@ and a direct map with 8000 entries would
containing an average of 8 entries, which should be acceptable.
However, if excessive CPU usage is observed during automount lookups
-increasing this option can reduce the CPU overhead considerably becuase
+increasing this option can reduce the CPU overhead considerably because
it reduces the length of the search chains.
Note that the number of entries in a map doesn't necessarily relate
to the number of entries used in the map entry cache.
-There are three distinct cases, direct maps and indirect maps that
-use the "browse" option must be read in their entirity at program
-start so, in these two cases the map size does retate directly to
-the map entry cache size.
+There are two distinct cases where the map hash table can make a
+significant difference, direct maps and indirect maps that use the
+"browse" option.
For indirect maps that do not use the "browse" option entries are
added to the map entry cache at lookup so the number of active cache
@@ -174,7 +173,7 @@ by the number of retries that would be u
.B use_mount_request_log_id
.br
Set whether to use a mount request log id so that log entries for specific
-mount requests can be easily identified in logs that have multiple conncurrent
+mount requests can be easily identified in logs that have multiple concurrent
requests. Default is don't use mount request log ids.
.SS LDAP Configuration
.P
@@ -183,7 +182,7 @@ Configuration settings available are:
.B ldap_timeout
.br
Set the network response timeout (default 8).
-Set timeout value for the synchronous API calls. The default is the LDAP
+Set timeout value for the synchronous API calls. The default is the LDAP
library default of an infinite timeout.
.TP
.B ldap_network_timeout
@@ -323,7 +322,7 @@ cleaned on re-load, which is done when m
so these configuration entries are not used by autofs. An
exception to this is the case where the map is large. In this
case it may be necessary to read the whole map at startup even if
-browsing is is not enabled. Adding the cache:=all option to
+browsing is not enabled. Adding the cache:=all option to
map_options can be used to for this.
.TP
.B localhost_address
@@ -390,14 +389,14 @@ and that will be done.
Allow map keys to be shown in directory listings. This option
can have values of "yes" or "no". The default is "no". A variation
of this option, "browsable", can be used as a pseudo mount option
-in type "auto" map entries to provide provide browsing funtionality
+in type "auto" map entries to provide browsing functionality
in sub-mounts. The amd "browsable_dirs = full" option cannot be
implemented within the current autofs framework and is not supported.
.TP
.B exec_map_timeout
.br
-A timeout is not currently used for for program maps, might be
-implemented.
+A timeout is not currently used for program maps but this might be
+implemented in the future.
.TP
.B tag
.br
@@ -473,7 +472,7 @@ its official host name.
.TP
.B domain_strip
.br
-If set to "yes" the domain name part of the host is strippped
+If set to "yes" the domain name part of the host is stripped
when normalizing hostnames. This can be useful when using of
the same maps in a multiple domain environment.
.TP
@@ -497,8 +496,8 @@ that is used for queries if ldap is to b
.B ldap_hostports
.br
This option has no default value set. It must be set to the URI
-of the LDAP server to be used for lookups wheni ldap is used a
-map source. It may contain a comma or space separated list of
+of the LDAP server to be used for lookups when ldap is used as
+a map source. It may contain a comma or space separated list of
LDAP URIs.
.TP
.B hesiod_base
--- autofs-5.1.4.orig/man/autofs_ldap_auth.conf.5.in
+++ autofs-5.1.4/man/autofs_ldap_auth.conf.5.in
@@ -56,7 +56,7 @@ required in order to perform ldap querie
sasl authenticated connections will be allowed. If it is set to no then
authentication is not needed for ldap server connections. If it is set to
autodetect then the ldap server will be queried to establish a suitable sasl
-authentication mechanism. If no suitable mechanism can be found, connections
+authentication mechanism. If no suitable mechanism can be found, connections
to the ldap server are made without authentication. Finally, if it is set to
simple, then simple authentication will be used instead of SASL.
.TP
--- autofs-5.1.4.orig/man/automount.8
+++ autofs-5.1.4/man/automount.8
@@ -89,7 +89,7 @@ that would be used by autofs for the who
.TP
.I "\-O, \-\-global-options"
Allows the specification of global mount options used for all master
-map entries. These options will either replace or be appened to options
+map entries. These options will either replace or be appended to options
given in a master map entry depending on the APPEND_OPTIONS configuration
setting.
.TP
--- autofs-5.1.4.orig/modules/lookup_ldap.c
+++ autofs-5.1.4/modules/lookup_ldap.c
@@ -1320,11 +1320,11 @@ auth_fail:
ret |= get_property(logopt, root, "external_key", &extern_key);
/*
* For EXTERNAL auth to function we need a client certificate
- * and and certificate key. The ca certificate used to verify
+ * and certificate key. The ca certificate used to verify
* the server certificate must also be set correctly in the
* global configuration as the connection must be encrypted
* and the server and client certificates must have been
- * verified for the EXTERNAL method to be offerred by the
+ * verified for the EXTERNAL method to be offered by the
* server. If the cert and key have not been set in the autofs
* configuration they must be set in the ldap rc file.
*/
--- autofs-5.1.4.orig/modules/replicated.c
+++ autofs-5.1.4/modules/replicated.c
@@ -24,11 +24,11 @@
* - PROXIMITY_OTHER, host is on a network not directlty
* reachable through a local interface.
*
- * 2) NFS version and protocol is selected by caclculating the largest
+ * 2) NFS version and protocol is selected by calculating the largest
* number of hosts supporting an NFS version and protocol that
* have the closest proximity. These hosts are added to the list
* in response time order. Hosts may have a corresponding weight
- * which essentially increaes response time and so influences the
+ * which essentially increases response time and so influences the
* host order.
*
* 3) Hosts at further proximity that support the selected NFS version
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
+++ autofs-5.1.4/redhat/autofs.conf.default.in
@@ -79,7 +79,7 @@ mount_nfs_default_protocol = 4
# are run as the privileded user this opens
# automount(8) to potential user privilege
# escalation when the program map is written
-# in a language that can load components from,
+# in a language that can load components from,
# for example, a user home directory.
#
# force_standard_program_map_env = no
@@ -87,7 +87,7 @@ mount_nfs_default_protocol = 4
# use_mount_request_log_id - Set whether to use a mount request log
# id so that log entries for specific mount
# requests can be easily identified in logs
-# that have multiple conncurrent requests.
+# that have multiple concurrent requests.
#
#use_mount_request_log_id = no
#
@@ -419,10 +419,10 @@ dismount_interval = 300
# appears to work reasonably well most of the time without the
# update).
#
-# autofs_use_lofs = yes
+#autofs_use_lofs = yes
#
# Several configuration options can be set per mount point.
-# In particulr map_type, map_name, map_defaults, search_path,
+# In particular map_type, map_name, map_defaults, search_path,
# browsable_dirs, dismount_interval and selectors_in_defaults
# (not all of which are currently implemented, see above).
#
@@ -431,6 +431,6 @@ dismount_interval = 300
# master map entry and the format will be inherited for type
# "auto" mounts.
#
-# [ /expamle/mount ]
-# dismount_interval = 60
-# map_type = nis
+#[ /example/mount ]
+#dismount_interval = 60
+#map_type = nis
--- autofs-5.1.4.orig/redhat/autofs.sysconfig
+++ autofs-5.1.4/redhat/autofs.sysconfig
@@ -1,5 +1,5 @@
#
-# Init syatem options
+# Init system options
#
# If the kernel supports using the autofs miscellanous device
# and you wish to use it you must set this configuration option
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
+++ autofs-5.1.4/samples/autofs.conf.default.in
@@ -78,7 +78,7 @@ browse_mode = no
# are run as the privileded user this opens
# automount(8) to potential user privilege
# escalation when the program map is written
-# in a language that can load components from,
+# in a language that can load components from,
# for example, a user home directory.
#
# force_standard_program_map_env = no
@@ -86,7 +86,7 @@ browse_mode = no
# use_mount_request_log_id - Set whether to use a mount request log
# id so that log entries for specific mount
# requests can be easily identified in logs
-# that have multiple conncurrent requests.
+# that have multiple concurrent requests.
#
#use_mount_request_log_id = no
#
@@ -430,6 +430,6 @@ dismount_interval = 300
# master map entry and the format will be inherited for type
# "auto" mounts.
#
-# [ /expamle/mount ]
-# dismount_interval = 60
-# map_type = nis
+#[ /example/mount ]
+#dismount_interval = 60
+#map_type = nis

View File

@ -0,0 +1,33 @@
autofs-5.1.5 - fix amd entry memory leak
From: Ian Kent <raven@themaw.net>
Fix an incorrect free of an amd_entry structure.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -58,6 +58,7 @@ xx/xx/2018 autofs-5.1.5
- remove unused function has_fstab_option().
- remove unused function reverse_mnt_list().
- remove a couple of old debug messages.
+- fix amd entry memory leak.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -155,7 +155,7 @@ void master_free_autofs_point(struct aut
ext_mount_remove(&entry->ext_mount, entry->fs);
if (!list_empty(&entry->entries))
list_del(&entry->entries);
- free(entry);
+ free_amd_entry(entry);
}
mounts_mutex_unlock(ap);

View File

@ -0,0 +1,49 @@
autofs-5.1.5 - fix hesiod string check in master_parse()
From: Ian Kent <raven@themaw.net>
When map source is specified in a master map entry, checking if
map type is hesiod in master_parse() will generate a SEGV if a
parser type is not also present becuase tmp will be NULL in this
case.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -37,6 +37,7 @@ xx/xx/2018 autofs-5.1.5
- fix incorrect locking in sss lookup.
- fix amd parser opts option handling.
- better handle hesiod support not built in.
+- fix hesiod string check in master_parse().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/master_parse.y
+++ autofs-5.1.4/lib/master_parse.y
@@ -172,8 +172,8 @@ line:
if ((tmp = strchr($2, ',')))
*tmp++ = '\0';
#ifndef WITH_HESIOD
- /* Map type or or map type parser is hesiod */
- if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
+ /* Map type or map type parser is hesiod */
+ if (!strcmp($2, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
master_error("hesiod support not built in");
local_free_vars();
YYABORT;
@@ -360,8 +360,8 @@ map: PATH
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
#ifndef WITH_HESIOD
- /* Map type or or map type parser is hesiod */
- if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
+ /* Map type or map type parser is hesiod */
+ if (!strcmp($1, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
master_error("hesiod support not built in");
local_free_vars();
YYABORT;

View File

@ -0,0 +1,419 @@
autofs-5.1.5 - fix macro expansion in selector values
From: Ian Kent <raven@themaw.net>
Macro expansion is not done in selector values before use, for example
in "hostd==${/key}.<donain>.<name>" the ${/key} is not expanded before
use leading to an attempt to use an invalid host name.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
modules/parse_amd.c | 286 ++++++++++++++++++++++++++++++++++------------------
2 files changed, 193 insertions(+), 94 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -52,6 +52,7 @@ xx/xx/2018 autofs-5.1.5
- log mount call arguments if mount_verbose is set.
- make expire remaining log level debug.
- allow period following macro in selector value.
+- fix macro expansion in selector values.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/parse_amd.c
+++ autofs-5.1.4/modules/parse_amd.c
@@ -231,17 +231,29 @@ static struct substvar *add_lookup_vars(
return list;
}
-static int match_my_name(unsigned int logopt, const char *name, struct substvar *sv)
+static int match_my_name(struct autofs_point *ap, const char *name, struct substvar *sv)
{
struct addrinfo hints, *cni, *ni, *haddr;
char host[NI_MAXHOST + 1], numeric[NI_MAXHOST + 1];
+ unsigned int logopt = ap->logopt;
const struct substvar *v;
+ char *exp_name = NULL;
int rv = 0, ret;
+ if (!expand_selectors(ap, name, &exp_name, sv))
+ exp_name = strdup(name);
+ if (!exp_name) {
+ error(logopt,
+ MODPREFIX "error: failed to alloc space for name");
+ goto out;
+ }
+
v = macro_findvar(sv, "host", 4);
if (v) {
- if (!strcmp(v->val, name))
- return 1;
+ if (!strcmp(v->val, exp_name)) {
+ rv = 1;
+ goto out;
+ }
}
if (!v || !v->val) {
@@ -268,11 +280,11 @@ static int match_my_name(unsigned int lo
hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME;
/* Resolve comparison name to its names and compare */
- ret = getaddrinfo(name, NULL, &hints, &ni);
+ ret = getaddrinfo(exp_name, NULL, &hints, &ni);
if (ret) {
error(logopt, MODPREFIX
"hostname lookup for %s failed: %s\n",
- name, gai_strerror(ret));
+ exp_name, gai_strerror(ret));
freeaddrinfo(cni);
goto out;
}
@@ -310,18 +322,180 @@ next:
freeaddrinfo(ni);
freeaddrinfo(cni);
out:
+ if (exp_name)
+ free(exp_name);
return rv;
}
-static int eval_selector(unsigned int logopt,
+static int sel_strcmp(struct autofs_point *ap,
+ const struct substvar *v, struct selector *s,
+ struct substvar *sv)
+{
+ char *expand = NULL;
+ int ret = 0;
+ int res;
+
+ res = expand_selectors(ap, s->comp.value, &expand, sv);
+ if (res)
+ res = strcmp(v->val, expand);
+ else
+ res = strcmp(v->val, s->comp.value);
+
+ if (s->compare & SEL_COMP_EQUAL && !res) {
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s) == %s",
+ v->def, v->val, expand ? expand : s->comp.value);
+ ret = 1;
+ } else if (s->compare & SEL_COMP_NOTEQUAL && res) {
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s) != %s",
+ v->def, v->val, expand ? expand : s->comp.value);
+ ret = 1;
+ } else
+ debug(ap->logopt, MODPREFIX
+ "did not match selector %s(%s) %s %s",
+ v->def, v->val,
+ (s->compare & SEL_COMP_EQUAL ? "==" : "!="),
+ expand ? expand : s->comp.value);
+
+ if (expand)
+ free(expand);
+
+ return ret;
+}
+
+static int sel_lstat(struct autofs_point *ap,
+ struct selector *s, struct substvar *sv)
+{
+ struct stat st;
+ char *expand = NULL;
+ int res, ret;
+
+ /* Sould be OK to fail on any error here */
+ res = expand_selectors(ap, s->func.arg1, &expand, sv);
+ if (res)
+ ret = !lstat(expand, &st);
+ else
+ ret = !lstat(s->func.arg1, &st);
+
+ if (s->compare == SEL_COMP_NOT)
+ ret = !ret;
+ if (ret)
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s)",
+ s->sel->name, expand ? expand : s->func.arg1);
+ else
+ debug(ap->logopt, MODPREFIX
+ "did not match selector %s(%s)",
+ s->sel->name, expand ? expand : s->func.arg1);
+ if (expand)
+ free(expand);
+
+ return ret;
+}
+
+static int sel_in_network(struct autofs_point *ap,
+ struct selector *s, struct substvar *sv)
+{
+ char *expand = NULL;
+ int res, ret;
+
+ res = expand_selectors(ap, s->func.arg1, &expand, sv);
+ if (!res)
+ ret = in_network(s->func.arg1);
+ else
+ ret = in_network(expand);
+
+ if (s->compare == SEL_COMP_NOT)
+ ret = !ret;
+ if (ret)
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s)",
+ s->sel->name, expand ? expand : s->func.arg1);
+ else
+ debug(ap->logopt, MODPREFIX
+ "did not match selector %s(%s)",
+ s->sel->name, expand ? expand : s->func.arg1);
+
+ if (expand)
+ free(expand);
+
+ return ret;
+}
+
+static int sel_netgrp(struct autofs_point *ap,
+ struct selector *s, struct substvar *sv)
+{
+ char *exp_arg1 = NULL, *exp_arg2 = NULL;
+ const struct substvar *v;
+ int res, ret = 0;
+ char *host;
+
+ if (s->func.arg2) {
+ res = expand_selectors(ap, s->func.arg2, &exp_arg2, sv);
+ if (res)
+ host = exp_arg2;
+ else
+ host = s->func.arg2;
+ } else {
+ if (s->sel->selector == SEL_NETGRP)
+ v = macro_findvar(sv, "host", 4);
+ else
+ v = macro_findvar(sv, "hostd", 5);
+ if (!v || !*v->val) {
+ error(ap->logopt, MODPREFIX
+ "failed to get value of ${host}");
+ goto out;
+ }
+ host = v->val;
+ }
+
+ res = expand_selectors(ap, s->func.arg1, &exp_arg1, sv);
+ if (res)
+ ret = innetgr(exp_arg1, host, NULL, NULL);
+ else
+ ret = innetgr(s->func.arg1, host, NULL, NULL);
+
+ if (s->compare == SEL_COMP_NOT)
+ ret = !ret;
+ if (ret) {
+ if (!s->func.arg2)
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s)",
+ s->sel->name, exp_arg1 ? exp_arg1 : s->func.arg1);
+ else
+ debug(ap->logopt, MODPREFIX
+ "matched selector %s(%s,%s)", s->sel->name,
+ exp_arg1 ? exp_arg1 : s->func.arg1,
+ exp_arg2 ? exp_arg2 : s->func.arg2);
+ } else {
+ if (!s->func.arg2)
+ debug(ap->logopt, MODPREFIX
+ "did not match selector %s(%s)",
+ s->sel->name, exp_arg1 ? exp_arg1 : s->func.arg1);
+ else
+ debug(ap->logopt, MODPREFIX
+ "did not match selector %s(%s,%s)", s->sel->name,
+ exp_arg1 ? exp_arg1 : s->func.arg1,
+ exp_arg2 ? exp_arg2 : s->func.arg2);
+ }
+out:
+ if (exp_arg1)
+ free(exp_arg1);
+ if (exp_arg2)
+ free(exp_arg2);
+
+ return ret;
+}
+
+static int eval_selector(struct autofs_point *ap,
struct amd_entry *this, struct substvar *sv)
{
struct selector *s = this->selector;
+ unsigned int logopt = ap->logopt;
const struct substvar *v;
unsigned int s_type;
unsigned int v_type;
- struct stat st;
- char *host;
int res, val, ret = 0;
s_type = s->sel->flags & SEL_FLAGS_TYPE_MASK;
@@ -339,26 +513,7 @@ static int eval_selector(unsigned int lo
switch (v_type) {
case SEL_FLAG_STR:
- res = strcmp(v->val, s->comp.value);
- if (s->compare & SEL_COMP_EQUAL && !res) {
- debug(logopt, MODPREFIX
- "matched selector %s(%s) == %s",
- v->def, v->val, s->comp.value);
- ret = 1;
- break;
- } else if (s->compare & SEL_COMP_NOTEQUAL && res) {
- debug(logopt, MODPREFIX
- "matched selector %s(%s) != %s",
- v->def, v->val, s->comp.value);
- ret = 1;
- break;
- }
-
- debug(logopt, MODPREFIX
- "did not match selector %s(%s) %s %s",
- v->def, v->val,
- (s->compare & SEL_COMP_EQUAL ? "==" : "!="),
- s->comp.value);
+ ret = sel_strcmp(ap, v, s, sv);
break;
case SEL_FLAG_NUM:
@@ -434,7 +589,7 @@ static int eval_selector(unsigned int lo
break;
case SEL_XHOST:
- ret = match_my_name(logopt, s->func.arg1, sv);
+ ret = match_my_name(ap, s->func.arg1, sv);
if (s->compare == SEL_COMP_NOT)
ret = !ret;
if (ret)
@@ -448,32 +603,11 @@ static int eval_selector(unsigned int lo
break;
case SEL_EXISTS:
- /* Sould be OK to fail on any error here */
- ret = !lstat(s->func.arg1, &st);
- if (s->compare == SEL_COMP_NOT)
- ret = !ret;
- if (ret)
- debug(logopt, MODPREFIX
- "matched selector %s(%s)",
- s->sel->name, s->func.arg1);
- else
- debug(logopt, MODPREFIX
- "did not match selector %s(%s)",
- s->sel->name, s->func.arg1);
+ ret = sel_lstat(ap, s, sv);
break;
case SEL_IN_NETWORK:
- ret = in_network(s->func.arg1);
- if (s->compare == SEL_COMP_NOT)
- ret = !ret;
- if (ret)
- debug(logopt, MODPREFIX
- "matched selector %s(%s)",
- s->sel->name, s->func.arg1);
- else
- debug(logopt, MODPREFIX
- "did not match selector %s(%s)",
- s->sel->name, s->func.arg1);
+ ret = sel_in_network(ap, s, sv);
break;
default:
@@ -492,43 +626,7 @@ static int eval_selector(unsigned int lo
switch (s->sel->selector) {
case SEL_NETGRP:
case SEL_NETGRPD:
- if (s->func.arg2)
- host = s->func.arg2;
- else {
- if (s->sel->selector == SEL_NETGRP)
- v = macro_findvar(sv, "host", 4);
- else
- v = macro_findvar(sv, "hostd", 5);
- if (!v || !*v->val) {
- error(logopt, MODPREFIX
- "failed to get value of ${host}");
- break;
- }
- host = v->val;
- }
- ret = innetgr(s->func.arg1, host, NULL, NULL);
- if (s->compare == SEL_COMP_NOT)
- ret = !ret;
- if (ret) {
- if (!s->func.arg2)
- debug(logopt, MODPREFIX
- "matched selector %s(%s)",
- s->sel->name, s->func.arg1);
- else
- debug(logopt, MODPREFIX
- "matched selector %s(%s,%s)",
- s->sel->name, s->func.arg1,
- s->func.arg2);
- } else {
- if (!s->func.arg2)
- debug(logopt, MODPREFIX
- "did not match selector %s(%s)",
- s->sel->name, s->func.arg1);
- else
- debug(logopt, MODPREFIX
- "did not match selector %s(%s,%s)",
- s->sel->name, s->func.arg1, s->func.arg2);
- }
+ ret = sel_netgrp(ap, s, sv);
break;
default:
@@ -1753,7 +1851,7 @@ static void update_prefix(struct autofs_
return;
}
-static int match_selectors(unsigned int logopt,
+static int match_selectors(struct autofs_point *ap,
struct amd_entry *entry, struct substvar *sv)
{
struct selector *s = entry->selector;
@@ -1761,7 +1859,7 @@ static int match_selectors(unsigned int
/* No selectors, always match */
if (!s) {
- debug(logopt, MODPREFIX "no selectors found in location");
+ debug(ap->logopt, MODPREFIX "no selectors found in location");
return 1;
}
@@ -1769,7 +1867,7 @@ static int match_selectors(unsigned int
/* All selectors must match */
while (s) {
- ret = eval_selector(logopt, entry, sv);
+ ret = eval_selector(ap, entry, sv);
if (!ret)
break;
s = s->next;
@@ -1939,7 +2037,7 @@ static struct amd_entry *select_default_
if (!this->selector)
continue;
- if (match_selectors(ap->logopt, this, sv)) {
+ if (match_selectors(ap, this, sv)) {
if (entry_default) {
/*update_with_defaults(entry_default, this, sv);*/
free_amd_entry(entry_default);
@@ -2192,7 +2290,7 @@ int parse_mount(struct autofs_point *ap,
break;
}
- if (!match_selectors(ap->logopt, this, sv))
+ if (!match_selectors(ap, this, sv))
continue;
at_least_one = 1;

View File

@ -0,0 +1,34 @@
autofs-5.1.5 - fix missing initialization of autofs_point flags
From: Ian Kent <raven@themaw.net>
When adding the "use_ignore_mount_option" configuration option I added
a "use without initialization" for ap->flags.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master.c | 2 ++
2 files changed, 3 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -75,6 +75,7 @@ xx/xx/2018 autofs-5.1.5
- use local_getmntent_r() for unlink_mount_tree().
- use local getmntent_r() in get_mnt_list().
- use local getmntent_r() in tree_make_mnt_list().
+- fix missing initialization of autofs_point flags.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -101,6 +101,8 @@ int master_add_autofs_point(struct maste
ap->negative_timeout = global_negative_timeout;
ap->exp_timeout = defaults_get_timeout();
ap->exp_runfreq = 0;
+ ap->flags = 0;
+
if (defaults_get_use_ignore_mount_option())
ap->flags = MOUNT_FLAG_IGNORE;
if (ghost)

View File

@ -0,0 +1,136 @@
autofs-5.1.5 - fix unlink_mount_tree() not umounting mounts
From: Ian Kent <raven@themaw.net>
At some point a check matching process group id of mounts was added to
the unlink_mount_tree() function so that mounts not matching the group
id of the calling process would be skipped.
But unlink_mount_tree() is meant to force a cleanup of mounts from a
previous automount process so the process group of the current process
can never match so all mounts are skipped.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 7 -------
daemon/indirect.c | 9 ---------
include/mounts.h | 1 -
lib/mounts.c | 20 --------------------
5 files changed, 1 insertion(+), 37 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -59,6 +59,7 @@ xx/xx/2018 autofs-5.1.5
- remove unused function reverse_mnt_list().
- remove a couple of old debug messages.
- fix amd entry memory leak.
+- fix unlink_mount_tree() not umounting mounts.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -264,10 +264,6 @@ static int unlink_mount_tree(struct auto
{
struct list_head *p;
int rv, ret;
- pid_t pgrp = getpgrp();
- char spgrp[20];
-
- sprintf(spgrp, "pgrp=%d", pgrp);
ret = 1;
list_for_each(p, list) {
@@ -275,9 +271,6 @@ static int unlink_mount_tree(struct auto
mnt = list_entry(p, struct mnt_list, list);
- if (strstr(mnt->opts, spgrp))
- continue;
-
if (strcmp(mnt->fs_type, "autofs"))
rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
else
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -44,19 +44,10 @@ static int unlink_mount_tree(struct auto
{
struct mnt_list *this;
int rv, ret;
- pid_t pgrp = getpgrp();
- char spgrp[20];
-
- sprintf(spgrp, "pgrp=%d", pgrp);
ret = 1;
this = mnts;
while (this) {
- if (strstr(this->opts, spgrp)) {
- this = this->next;
- continue;
- }
-
if (strcmp(this->fs_type, "autofs"))
rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
else
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -53,7 +53,6 @@ struct mnt_list {
char *fs_name;
char *fs_type;
char *opts;
- pid_t owner;
/*
* List operations ie. get_mnt_list.
*/
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -798,7 +798,6 @@ struct mnt_list *get_mnt_list(const char
struct mntent *mnt;
struct mnt_list *ent, *mptr, *last;
struct mnt_list *list = NULL;
- char *pgrp;
size_t len;
if (!path || !pathlen || pathlen > PATH_MAX)
@@ -879,15 +878,6 @@ struct mnt_list *get_mnt_list(const char
return NULL;
}
strcpy(ent->opts, mnt->mnt_opts);
-
- ent->owner = 0;
- pgrp = strstr(mnt->mnt_opts, "pgrp=");
- if (pgrp) {
- char *end = strchr(pgrp, ',');
- if (end)
- *end = '\0';
- sscanf(pgrp, "pgrp=%d", &ent->owner);
- }
}
endmntent(tab);
@@ -1068,7 +1058,6 @@ struct mnt_list *tree_make_mnt_tree(cons
struct mntent *mnt;
struct mnt_list *ent, *mptr;
struct mnt_list *tree = NULL;
- char *pgrp;
size_t plen;
int eq;
@@ -1147,15 +1136,6 @@ struct mnt_list *tree_make_mnt_tree(cons
}
strcpy(ent->opts, mnt->mnt_opts);
- ent->owner = 0;
- pgrp = strstr(mnt->mnt_opts, "pgrp=");
- if (pgrp) {
- char *end = strchr(pgrp, ',');
- if (end)
- *end = '\0';
- sscanf(pgrp, "pgrp=%d", &ent->owner);
- }
-
mptr = tree;
while (mptr) {
int elen = strlen(ent->path);

View File

@ -0,0 +1,222 @@
autofs-5.1.5 - log mount call arguments if mount_verbose is set
From: Lars R. Damerow <lars@pixar.com>
Override the debug log only setting if mount_verbose is set so that
mount parameter information is logged on mount.
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_afs.c | 6 +++++-
modules/mount_bind.c | 10 +++++++---
modules/mount_ext2.c | 16 ++++++++++------
modules/mount_generic.c | 14 +++++++++-----
modules/mount_nfs.c | 29 +++++++++++++++++------------
6 files changed, 49 insertions(+), 27 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -49,6 +49,7 @@ xx/xx/2018 autofs-5.1.5
- use malloc(3) in spawn.c.
- add mount_verbose configuration option.
- optionally log mount requestor process info.
+- log mount call arguments if mount_verbose is set.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/modules/mount_afs.c
+++ autofs-5.1.4/modules/mount_afs.c
@@ -37,10 +37,14 @@ int mount_mount(struct autofs_point *ap,
char dest[PATH_MAX + 1];
size_t r_len = strlen(root);
size_t d_len = r_len + name_len + 2;
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
if (ap->flags & MOUNT_FLAG_REMOUNT)
return 0;
+ if (defaults_get_mount_verbose())
+ mountlog = &log_info;
+
if (d_len > PATH_MAX)
return 1;
@@ -53,7 +57,7 @@ int mount_mount(struct autofs_point *ap,
if (dest[strlen(dest)-1] == '/')
dest[strlen(dest)-1] = '\0';
- debug(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
+ mountlog(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
return symlink(what, dest); /* Try it. If it fails, return the error. */
}
--- autofs-5.1.4.orig/modules/mount_bind.c
+++ autofs-5.1.4/modules/mount_bind.c
@@ -81,10 +81,14 @@ int mount_mount(struct autofs_point *ap,
int err;
int i, len;
int symlnk = (*name != '/' && (ap->flags & MOUNT_FLAG_SYMLINK));
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
if (ap->flags & MOUNT_FLAG_REMOUNT)
return 0;
+ if (defaults_get_mount_verbose())
+ mountlog = &log_info;
+
/* Extract "symlink" pseudo-option which forces local filesystems
* to be symlinked instead of bound.
*/
@@ -164,9 +168,9 @@ int mount_mount(struct autofs_point *ap,
if (!status)
existed = 0;
- debug(ap->logopt, MODPREFIX
- "calling mount --bind -o %s %s %s",
- options, what, fullpath);
+ mountlog(ap->logopt, MODPREFIX
+ "calling mount --bind -o %s %s %s",
+ options, what, fullpath);
err = spawn_bind_mount(ap->logopt, "-o",
options, what, fullpath, NULL);
--- autofs-5.1.4.orig/modules/mount_ext2.c
+++ autofs-5.1.4/modules/mount_ext2.c
@@ -47,10 +47,14 @@ int mount_mount(struct autofs_point *ap,
int err, ro = 0;
const char *fsck_prog;
int len, status, existed = 1;
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
if (ap->flags & MOUNT_FLAG_REMOUNT)
return 0;
+ if (defaults_get_mount_verbose())
+ mountlog = &log_info;
+
/* Root offset of multi-mount */
len = strlen(root);
if (root[len - 1] == '/') {
@@ -121,15 +125,15 @@ int mount_mount(struct autofs_point *ap,
}
if (options) {
- debug(ap->logopt, MODPREFIX
- "calling mount -t %s -o %s %s %s",
- fstype, options, what, fullpath);
+ mountlog(ap->logopt, MODPREFIX
+ "calling mount -t %s -o %s %s %s",
+ fstype, options, what, fullpath);
err = spawn_mount(ap->logopt, "-t", fstype,
"-o", options, what, fullpath, NULL);
} else {
- debug(ap->logopt,
- MODPREFIX "calling mount -t %s %s %s",
- fstype, what, fullpath);
+ mountlog(ap->logopt,
+ MODPREFIX "calling mount -t %s %s %s",
+ fstype, what, fullpath);
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL);
}
--- autofs-5.1.4.orig/modules/mount_generic.c
+++ autofs-5.1.4/modules/mount_generic.c
@@ -46,10 +46,14 @@ int mount_mount(struct autofs_point *ap,
char buf[MAX_ERR_BUF];
int err;
int len, status, existed = 1;
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
if (ap->flags & MOUNT_FLAG_REMOUNT)
return 0;
+ if (defaults_get_mount_verbose())
+ mountlog = &log_info;
+
/* Root offset of multi-mount */
len = strlen(root);
if (root[len - 1] == '/') {
@@ -80,15 +84,15 @@ int mount_mount(struct autofs_point *ap,
existed = 0;
if (options && options[0]) {
- debug(ap->logopt,
- MODPREFIX "calling mount -t %s -o %s %s %s",
- fstype, options, what, fullpath);
+ mountlog(ap->logopt,
+ MODPREFIX "calling mount -t %s -o %s %s %s",
+ fstype, options, what, fullpath);
err = spawn_mount(ap->logopt, "-t", fstype,
"-o", options, what, fullpath, NULL);
} else {
- debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
- fstype, what, fullpath);
+ mountlog(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
+ fstype, what, fullpath);
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL);
}
--- autofs-5.1.4.orig/modules/mount_nfs.c
+++ autofs-5.1.4/modules/mount_nfs.c
@@ -77,13 +77,17 @@ int mount_mount(struct autofs_point *ap,
int port = -1;
int ro = 0; /* Set if mount bind should be read-only */
int rdma = 0;
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
if (ap->flags & MOUNT_FLAG_REMOUNT)
return 0;
- debug(ap->logopt,
- MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
- root, name, what, fstype, options);
+ if (defaults_get_mount_verbose())
+ mountlog = &log_info;
+
+ mountlog(ap->logopt,
+ MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
+ root, name, what, fstype, options);
mount_default_proto = defaults_get_mount_nfs_default_proto();
vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
@@ -203,9 +207,9 @@ int mount_mount(struct autofs_point *ap,
if ((vers & NFS_PROTO_MASK) == 0)
vers |= NFS_PROTO_MASK;
- debug(ap->logopt, MODPREFIX
- "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
- nfsoptions, nobind, nosymlink, ro);
+ mountlog(ap->logopt, MODPREFIX
+ "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
+ nfsoptions, nobind, nosymlink, ro);
}
if (!parse_location(ap->logopt, &hosts, what, flags)) {
@@ -379,17 +383,18 @@ dont_probe:
}
if (nfsoptions && *nfsoptions) {
- debug(ap->logopt,
- MODPREFIX "calling mount -t %s " SLOPPY
- "-o %s %s %s", fstype, nfsoptions, loc, fullpath);
+ mountlog(ap->logopt,
+ MODPREFIX "calling mount -t %s " SLOPPY
+ "-o %s %s %s", fstype, nfsoptions, loc,
+ fullpath);
err = spawn_mount(ap->logopt,
"-t", fstype, SLOPPYOPT "-o",
nfsoptions, loc, fullpath, NULL);
} else {
- debug(ap->logopt,
- MODPREFIX "calling mount -t %s %s %s",
- fstype, loc, fullpath);
+ mountlog(ap->logopt,
+ MODPREFIX "calling mount -t %s %s %s",
+ fstype, loc, fullpath);
err = spawn_mount(ap->logopt,
"-t", fstype, loc, fullpath, NULL);
}

View File

@ -0,0 +1,55 @@
autofs-5.1.5 - make expire remaining log level debug
From: Ian Kent <raven@themaw.net>
The log message listing the remaining mounts should be log level
debug not info.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 2 +-
daemon/indirect.c | 4 ++--
3 files changed, 4 insertions(+), 3 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -50,6 +50,7 @@ xx/xx/2018 autofs-5.1.5
- add mount_verbose configuration option.
- optionally log mount requestor process info.
- log mount call arguments if mount_verbose is set.
+- make expire remaining log level debug.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -990,7 +990,7 @@ void *expire_proc_direct(void *arg)
pthread_cleanup_pop(1);
if (left)
- info(ap->logopt, "%d remaining in %s", left, ap->path);
+ debug(ap->logopt, "%d remaining in %s", left, ap->path);
ec.status = left;
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -578,7 +578,7 @@ void *expire_proc_indirect(void *arg)
pthread_cleanup_pop(1);
if (submnts)
- info(ap->logopt,
+ debug(ap->logopt,
"%d submounts remaining in %s", submnts, ap->path);
/*
@@ -586,7 +586,7 @@ void *expire_proc_indirect(void *arg)
* words) the umounts are done by the time we reach here
*/
if (count)
- info(ap->logopt, "%d remaining in %s", count, ap->path);
+ debug(ap->logopt, "%d remaining in %s", count, ap->path);
ec.status = left;

View File

@ -0,0 +1,134 @@
autofs-5.1.5 - move unlink_mount_tree() to lib/mounts.c
From: Ian Kent <raven@themaw.net>
Both daemon/direct.c and daemon/indirect.c use the same function to
lazy umount a list of mounts, move that function to lib/mounts.c.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 2 --
daemon/indirect.c | 34 ----------------------------------
include/mounts.h | 1 +
lib/mounts.c | 35 +++++++++++++++++++++++++++++++++++
5 files changed, 37 insertions(+), 36 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -71,6 +71,7 @@ xx/xx/2018 autofs-5.1.5
- refactor unlink_active_mounts() in direct.c.
- don't use tree_is_mounted() for mounted checks.
- use single unlink_umount_tree() for both direct and indirect mounts.
+- move unlink_mount_tree() to lib/mounts.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -49,8 +49,6 @@ pthread_key_t key_mnt_direct_params;
pthread_key_t key_mnt_offset_params;
pthread_once_t key_mnt_params_once = PTHREAD_ONCE_INIT;
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
-
static void key_mnt_params_destroy(void *arg)
{
struct mnt_params *mp;
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -40,40 +40,6 @@
/* Attribute to create detached thread */
extern pthread_attr_t th_attr_detached;
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
-{
- struct mnt_list *this;
- int rv, ret;
-
- ret = 1;
- this = mnts;
- while (this) {
- if (this->flags & MNTS_AUTOFS)
- rv = umount2(this->mp, MNT_DETACH);
- else
- rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
- if (rv == -1) {
- debug(ap->logopt,
- "can't unlink %s from mount tree", this->mp);
-
- switch (errno) {
- case EINVAL:
- warn(ap->logopt,
- "bad superblock or not mounted");
- break;
-
- case ENOENT:
- case EFAULT:
- ret = 0;
- warn(ap->logopt, "bad path for mount");
- break;
- }
- }
- this = this->next;
- }
- return ret;
-}
-
static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
{
const char *str_indirect = mount_type_str(t_indirect);
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -100,6 +100,7 @@ int ext_mount_add(struct list_head *, co
int ext_mount_remove(struct list_head *, const char *);
int ext_mount_inuse(const char *);
struct mnt_list *get_mnt_list(const char *path, int include);
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
void free_mnt_list(struct mnt_list *list);
int is_mounted(const char *mp, unsigned int type);
void tree_free_mnt_tree(struct mnt_list *tree);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -881,6 +881,41 @@ local_getmntent_r(FILE *tab, struct mnte
return mnt;
}
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
+{
+ struct mnt_list *this;
+ int rv, ret;
+
+ ret = 1;
+ this = mnts;
+ while (this) {
+ if (this->flags & MNTS_AUTOFS)
+ rv = umount2(this->mp, MNT_DETACH);
+ else
+ rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
+ if (rv == -1) {
+ debug(ap->logopt,
+ "can't unlink %s from mount tree", this->mp);
+
+ switch (errno) {
+ case EINVAL:
+ warn(ap->logopt,
+ "bad superblock or not mounted");
+ break;
+
+ case ENOENT:
+ case EFAULT:
+ ret = 0;
+ warn(ap->logopt, "bad path for mount");
+ break;
+ }
+ }
+ this = this->next;
+ }
+
+ return ret;
+}
+
/*
* Get list of mounts under path in longest->shortest order
*/

View File

@ -0,0 +1,155 @@
autofs-5.1.5 - optionally log mount requestor process info
From: Lars R. Damerow <lars@pixar.com>
This information can be helpful to determine who or what is making
particular mount requests, especially when used in conjunction with
the use_mount_request_log_id option.
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 6 ++++++
daemon/indirect.c | 6 ++++++
include/log.h | 2 ++
lib/log.c | 39 +++++++++++++++++++++++++++++++++++++++
man/autofs.conf.5.in | 3 ++-
redhat/autofs.conf.default.in | 4 +++-
samples/autofs.conf.default.in | 4 +++-
8 files changed, 62 insertions(+), 3 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -48,6 +48,7 @@ xx/xx/2018 autofs-5.1.5
- add NULL check for get_addr_string() return.
- use malloc(3) in spawn.c.
- add mount_verbose configuration option.
+- optionally log mount requestor process info.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -1242,6 +1242,12 @@ static void *do_mount_direct(void *arg)
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
+ if (defaults_get_mount_verbose()) {
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
+ if (ppid > 0)
+ log_pidinfo(ap, ppid, "parent");
+ }
+
status = fstat(mt.ioctlfd, &st);
if (status == -1) {
error(ap->logopt,
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -758,6 +758,12 @@ static void *do_mount_indirect(void *arg
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
+ if (defaults_get_mount_verbose()) {
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
+ if (ppid > 0)
+ log_pidinfo(ap, ppid, "parent");
+ }
+
len = ncat_path(buf, sizeof(buf), ap->path, mt.name, mt.len);
if (!len) {
crit(ap->logopt, "path to be mounted is to long");
--- autofs-5.1.4.orig/include/log.h
+++ autofs-5.1.4/include/log.h
@@ -46,6 +46,8 @@ extern void log_crit(unsigned, const cha
extern void log_debug(unsigned int, const char* msg, ...);
extern void logmsg(const char* msg, ...);
+extern pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label);
+
#define debug(opt, msg, args...) \
do { log_debug(opt, "%s: " msg, __FUNCTION__, ##args); } while (0)
--- autofs-5.1.4.orig/lib/log.c
+++ autofs-5.1.4/lib/log.c
@@ -325,3 +325,42 @@ void log_to_stderr(void)
return;
}
+
+pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label) {
+ char buf[PATH_MAX + 1] = "";
+ FILE *statfile;
+
+ pid_t tgid, ppid;
+ int uid, euid, gid, egid;
+ char comm[64] = "";
+
+ sprintf(buf, "/proc/%d/status", pid);
+ statfile = fopen(buf, "r");
+ if (statfile == NULL) {
+ info(ap->logopt, "pidinfo %s: failed to open %s", label, buf);
+ return -1;
+ }
+
+ while (fgets(buf, sizeof(buf), statfile) != NULL) {
+ if (strncmp(buf, "Name:", 5) == 0) {
+ sscanf(buf, "Name:\t%s", (char *) &comm);
+ } else if (strncmp(buf, "Tgid:", 5) == 0) {
+ sscanf(buf, "Tgid:\t%d", (int *) &tgid);
+ } else if (strncmp(buf, "PPid:", 5) == 0) {
+ sscanf(buf, "PPid:\t%d", (int *) &ppid);
+ } else if (strncmp(buf, "Uid:", 4) == 0) {
+ sscanf(buf,
+ "Uid:\t%d\t%d", (int *) &uid, (int *) &euid);
+ } else if (strncmp(buf, "Gid:", 4) == 0) {
+ sscanf(buf,
+ "Gid:\t%d\t%d", (int *) &gid, (int *) &egid);
+ }
+ }
+ fclose(statfile);
+
+ info(ap->logopt,
+ "pidinfo %s: pid:%d comm:%s tgid:%d uid:%d euid:%d gid:%d egid:%d",
+ label, pid, comm, tgid, uid, euid, gid, egid);
+
+ return ppid;
+}
--- autofs-5.1.4.orig/man/autofs.conf.5.in
+++ autofs-5.1.4/man/autofs.conf.5.in
@@ -43,7 +43,8 @@ setting.
.TP
.B mount_verbose
.br
-Use the verbose flag when spawning mount(8) (program default "no").
+Use the verbose flag when spawning mount(8), and log some process info
+about the requestor and its parent (program default "no").
.TP
.B mount_wait
.br
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
+++ autofs-5.1.4/redhat/autofs.conf.default.in
@@ -26,7 +26,9 @@ timeout = 300
#
#negative_timeout = 60
#
-# mount_verbose - use the -v flag when calling mount(8).
+# mount_verbose - use the -v flag when calling mount(8) and log some
+# process information about the requestor and its
+# parent.
#
#mount_verbose = no
#
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
+++ autofs-5.1.4/samples/autofs.conf.default.in
@@ -26,7 +26,9 @@ timeout = 300
#
#negative_timeout = 60
#
-# mount_verbose - use the -v flag when calling mount(8).
+# mount_verbose - use the -v flag when calling mount(8) and log some
+# process information about the requestor and its
+# parent.
#
#mount_verbose = no
#

View File

@ -0,0 +1,116 @@
autofs-5.1.5 - refactor unlink_active_mounts() in direct_c
From: Ian Kent <raven@themaw.net>
In daemon/direct.c:unlink_active_mounts() the tree_get_mnt_list() call
returns 1 for a non-empty list which amounts to a mounted check and then
handles the case where the map is being read.
But the check that's carried out is to distinguish between a readmap
and a mount activity which should be handled by the caller instead of
burying the check away in the unlink_active_mounts() function.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/direct.c | 63 +++++++++++++++++++++++++++-----------------------------
2 files changed, 32 insertions(+), 32 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -68,6 +68,7 @@ xx/xx/2018 autofs-5.1.5
- always use PROC_MOUNTS to make mount lists.
- add glibc getmntent_r().
- use local getmntent_r in table_is_mounted().
+- refactor unlink_active_mounts() in direct.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -298,37 +298,12 @@ static int unlink_mount_tree(struct auto
static int unlink_active_mounts(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
{
- struct ioctl_ops *ops = get_ioctl_ops();
struct list_head list;
INIT_LIST_HEAD(&list);
- if (tree_get_mnt_list(mnts, &list, me->key, 1)) {
- if (ap->state == ST_READMAP) {
- time_t tout = get_exp_timeout(ap, me->source);
- int save_ioctlfd, ioctlfd;
-
- save_ioctlfd = ioctlfd = me->ioctlfd;
-
- if (ioctlfd == -1)
- ops->open(ap->logopt,
- &ioctlfd, me->dev, me->key);
-
- if (ioctlfd < 0) {
- error(ap->logopt,
- "failed to create ioctl fd for %s",
- me->key);
- return 0;
- }
-
- ops->timeout(ap->logopt, ioctlfd, tout);
-
- if (save_ioctlfd == -1)
- ops->close(ap->logopt, ioctlfd);
-
- return 0;
- }
- }
+ if (!tree_get_mnt_list(mnts, &list, me->key, 1))
+ return 1;
if (!unlink_mount_tree(ap, &list)) {
debug(ap->logopt,
@@ -371,16 +346,40 @@ int do_mount_autofs_direct(struct autofs
if (ret == 0)
return -1;
} else {
+ if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
+ time_t tout = get_exp_timeout(ap, me->source);
+ int save_ioctlfd, ioctlfd;
+
+ save_ioctlfd = ioctlfd = me->ioctlfd;
+
+ if (ioctlfd == -1)
+ ops->open(ap->logopt,
+ &ioctlfd, me->dev, me->key);
+
+ if (ioctlfd < 0) {
+ error(ap->logopt,
+ "failed to create ioctl fd for %s",
+ me->key);
+ return 0;
+ }
+
+ ops->timeout(ap->logopt, ioctlfd, tout);
+
+ if (save_ioctlfd == -1)
+ ops->close(ap->logopt, ioctlfd);
+
+ return 0;
+ }
+
/*
- * A return of 0 indicates we're re-reading the map.
* A return of 1 indicates we successfully unlinked
- * the mount tree if there was one. A return of -1
- * inducates we failed to unlink the mount tree so
+ * the mount tree if there was one. A return of 0
+ * indicates we failed to unlink the mount tree so
* we have to return a failure.
*/
ret = unlink_active_mounts(ap, mnts, me);
- if (ret == -1 || ret == 0)
- return ret;
+ if (!ret)
+ return -1;
if (me->ioctlfd != -1) {
error(ap->logopt, "active direct mount %s", me->key);

View File

@ -0,0 +1,38 @@
autofs-5.1.5 - remove a couple of old debug messages
From: Ian Kent <raven@themaw.net>
Remove a couple of debug log messages from lookup_ghost().
These messages have not shown a problem here and should be
removed.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/lookup.c | 5 -----
2 files changed, 1 insertion(+), 5 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -57,6 +57,7 @@ xx/xx/2018 autofs-5.1.5
- change expire type naming to better reflect usage.
- remove unused function has_fstab_option().
- remove unused function reverse_mnt_list().
+- remove a couple of old debug messages.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/lookup.c
+++ autofs-5.1.4/daemon/lookup.c
@@ -793,11 +793,6 @@ int lookup_ghost(struct autofs_point *ap
/* Directory already exists? */
if (!ret) {
- /* Shouldn't need this
- me->dev = st.st_dev;
- me->ino = st.st_ino;
- */
- debug(ap->logopt, "me->dev %d me->ino %d", me->dev, me->ino);
free(fullpath);
goto next;
}

View File

@ -0,0 +1,71 @@
autofs-5.1.5 - remove unused function has_fstab_option()
From: Ian Kent <raven@themaw.net>
This function is not used, remove it.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/mounts.h | 1 -
lib/mounts.c | 29 -----------------------------
3 files changed, 1 insertion(+), 30 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -55,6 +55,7 @@ xx/xx/2018 autofs-5.1.5
- fix macro expansion in selector values.
- also use strictexpire for offsets.
- change expire type naming to better reflect usage.
+- remove unused function has_fstab_option().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -103,7 +103,6 @@ struct mnt_list *get_mnt_list(const char
struct mnt_list *reverse_mnt_list(struct mnt_list *list);
void free_mnt_list(struct mnt_list *list);
int is_mounted(const char *table, const char *path, unsigned int type);
-int has_fstab_option(const char *opt);
void tree_free_mnt_tree(struct mnt_list *tree);
struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -1026,35 +1026,6 @@ int is_mounted(const char *table, const
return table_is_mounted(table, path, type);
}
-int has_fstab_option(const char *opt)
-{
- struct mntent *mnt;
- struct mntent mnt_wrk;
- char buf[PATH_MAX * 3];
- FILE *tab;
- int ret = 0;
-
- if (!opt)
- return 0;
-
- tab = open_setmntent_r(_PATH_MNTTAB);
- if (!tab) {
- char *estr = strerror_r(errno, buf, PATH_MAX - 1);
- logerr("setmntent: %s", estr);
- return 0;
- }
-
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
- if (hasmntopt(mnt, opt)) {
- ret = 1;
- break;
- }
- }
- endmntent(tab);
-
- return ret;
-}
-
/*
* Since we have to look at the entire mount tree for direct
* mounts (all mounts under "/") and we may have a large number

View File

@ -0,0 +1,63 @@
autofs-5.1.5 - remove unused function reverse_mnt_list()
From: Ian Kent <raven@themaw.net>
This function is not used, remove it.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/mounts.h | 1 -
lib/mounts.c | 21 ---------------------
3 files changed, 1 insertion(+), 22 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -56,6 +56,7 @@ xx/xx/2018 autofs-5.1.5
- also use strictexpire for offsets.
- change expire type naming to better reflect usage.
- remove unused function has_fstab_option().
+- remove unused function reverse_mnt_list().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -100,7 +100,6 @@ int ext_mount_add(struct list_head *, co
int ext_mount_remove(struct list_head *, const char *);
int ext_mount_inuse(const char *);
struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
-struct mnt_list *reverse_mnt_list(struct mnt_list *list);
void free_mnt_list(struct mnt_list *list);
int is_mounted(const char *table, const char *path, unsigned int type);
void tree_free_mnt_tree(struct mnt_list *tree);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -894,27 +894,6 @@ struct mnt_list *get_mnt_list(const char
return list;
}
-/*
- * Reverse a list of mounts
- */
-struct mnt_list *reverse_mnt_list(struct mnt_list *list)
-{
- struct mnt_list *next, *last;
-
- if (!list)
- return NULL;
-
- next = list;
- last = NULL;
- while (next) {
- struct mnt_list *this = next;
- next = this->next;
- this->next = last;
- last = this;
- }
- return last;
-}
-
void free_mnt_list(struct mnt_list *list)
{
struct mnt_list *next;

View File

@ -0,0 +1,279 @@
autofs-5.1.5 - use bit flags for autofs mount types in mnt_list
From: Ian Kent <raven@themaw.net>
Several fields in struct mnt_list don't need to be saved as strings
so change to using bit flags for them instead.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/direct.c | 10 ++---
daemon/indirect.c | 16 ++++----
include/mounts.h | 7 ++-
lib/mounts.c | 97 +++++++++++-------------------------------------------
5 files changed, 38 insertions(+), 93 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -63,6 +63,7 @@ xx/xx/2018 autofs-5.1.5
- add ignore mount option.
- use ignore option for offset mounts as well.
- add config option for "ignore" mount option
+- use bit flags for autofs mount types in mnt_list.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -271,10 +271,10 @@ static int unlink_mount_tree(struct auto
mnt = list_entry(p, struct mnt_list, list);
- if (strcmp(mnt->fs_type, "autofs"))
- rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
- else
+ if (mnt->flags & MNTS_AUTOFS)
rv = umount2(mnt->path, MNT_DETACH);
+ else
+ rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
if (rv == -1) {
debug(ap->logopt,
"can't unlink %s from mount tree", mnt->path);
@@ -925,7 +925,7 @@ void *expire_proc_direct(void *arg)
if (!me)
continue;
- if (!strcmp(next->fs_type, "autofs")) {
+ if (next->flags & MNTS_AUTOFS) {
struct stat st;
int ioctlfd;
@@ -936,7 +936,7 @@ void *expire_proc_direct(void *arg)
* one of them and pass on state change.
*/
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- if (strstr(next->opts, "indirect")) {
+ if (next->flags & MNTS_INDIRECT) {
master_notify_submount(ap, next->path, ap->state);
pthread_setcancelstate(cur_state, NULL);
continue;
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -48,10 +48,10 @@ static int unlink_mount_tree(struct auto
ret = 1;
this = mnts;
while (this) {
- if (strcmp(this->fs_type, "autofs"))
- rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
- else
+ if (this->flags & MNTS_AUTOFS)
rv = umount2(this->path, MNT_DETACH);
+ else
+ rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
if (rv == -1) {
debug(ap->logopt,
"can't unlink %s from mount tree", this->path);
@@ -439,15 +439,15 @@ void *expire_proc_indirect(void *arg)
char *ind_key;
int ret;
- if (!strcmp(next->fs_type, "autofs")) {
+ if (next->flags & MNTS_AUTOFS) {
/*
* If we have submounts check if this path lives below
* one of them and pass on the state change.
*/
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- if (strstr(next->opts, "indirect"))
+ if (next->flags & MNTS_INDIRECT)
master_notify_submount(ap, next->path, ap->state);
- else if (strstr(next->opts, "offset")) {
+ else if (next->flags & MNTS_OFFSET) {
struct map_source *map;
struct mapent_cache *mc = NULL;
struct mapent *me = NULL;
@@ -567,10 +567,10 @@ void *expire_proc_indirect(void *arg)
pthread_cleanup_push(mnts_cleanup, mnts);
/* Are there any real mounts left */
for (next = mnts; next; next = next->next) {
- if (strcmp(next->fs_type, "autofs"))
+ if (!(next->flags & MNTS_AUTOFS))
count++;
else {
- if (strstr(next->opts, "indirect"))
+ if (next->flags & MNTS_INDIRECT)
submnts++;
else
offsets++;
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -35,6 +35,9 @@
#define MNTS_ALL 0x0001
#define MNTS_REAL 0x0002
#define MNTS_AUTOFS 0x0004
+#define MNTS_INDIRECT 0x0008
+#define MNTS_DIRECT 0x0010
+#define MNTS_OFFSET 0x0020
#define REMOUNT_SUCCESS 0x0000
#define REMOUNT_FAIL 0x0001
@@ -50,9 +53,7 @@ struct mapent;
struct mnt_list {
char *path;
- char *fs_name;
- char *fs_type;
- char *opts;
+ unsigned int flags;
/*
* List operations ie. get_mnt_list.
*/
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -855,29 +855,17 @@ struct mnt_list *get_mnt_list(const char
}
strcpy(ent->path, mnt->mnt_dir);
- ent->fs_name = malloc(strlen(mnt->mnt_fsname) + 1);
- if (!ent->fs_name) {
- endmntent(tab);
- free_mnt_list(list);
- return NULL;
- }
- strcpy(ent->fs_name, mnt->mnt_fsname);
+ if (!strcmp(mnt->mnt_type, "autofs"))
+ ent->flags |= MNTS_AUTOFS;
- ent->fs_type = malloc(strlen(mnt->mnt_type) + 1);
- if (!ent->fs_type) {
- endmntent(tab);
- free_mnt_list(list);
- return NULL;
- }
- strcpy(ent->fs_type, mnt->mnt_type);
-
- ent->opts = malloc(strlen(mnt->mnt_opts) + 1);
- if (!ent->opts) {
- endmntent(tab);
- free_mnt_list(list);
- return NULL;
+ if (ent->flags & MNTS_AUTOFS) {
+ if (strstr(mnt->mnt_opts, "indirect"))
+ ent->flags |= MNTS_INDIRECT;
+ else if (strstr(mnt->mnt_opts, "direct"))
+ ent->flags |= MNTS_DIRECT;
+ else if (strstr(mnt->mnt_opts, "offset"))
+ ent->flags |= MNTS_OFFSET;
}
- strcpy(ent->opts, mnt->mnt_opts);
}
endmntent(tab);
@@ -900,15 +888,6 @@ void free_mnt_list(struct mnt_list *list
if (this->path)
free(this->path);
- if (this->fs_name)
- free(this->fs_name);
-
- if (this->fs_type)
- free(this->fs_type);
-
- if (this->opts)
- free(this->opts);
-
free(this);
}
}
@@ -1028,22 +1007,11 @@ void tree_free_mnt_tree(struct mnt_list
list_del(&this->self);
free(this->path);
- free(this->fs_name);
- free(this->fs_type);
-
- if (this->opts)
- free(this->opts);
free(this);
}
free(tree->path);
- free(tree->fs_name);
- free(tree->fs_type);
-
- if (tree->opts)
- free(tree->opts);
-
free(tree);
}
@@ -1103,38 +1071,17 @@ struct mnt_list *tree_make_mnt_tree(cons
}
strcpy(ent->path, mnt->mnt_dir);
- ent->fs_name = malloc(strlen(mnt->mnt_fsname) + 1);
- if (!ent->fs_name) {
- free(ent->path);
- free(ent);
- endmntent(tab);
- tree_free_mnt_tree(tree);
- return NULL;
- }
- strcpy(ent->fs_name, mnt->mnt_fsname);
-
- ent->fs_type = malloc(strlen(mnt->mnt_type) + 1);
- if (!ent->fs_type) {
- free(ent->fs_name);
- free(ent->path);
- free(ent);
- endmntent(tab);
- tree_free_mnt_tree(tree);
- return NULL;
- }
- strcpy(ent->fs_type, mnt->mnt_type);
+ if (!strcmp(mnt->mnt_type, "autofs"))
+ ent->flags |= MNTS_AUTOFS;
- ent->opts = malloc(strlen(mnt->mnt_opts) + 1);
- if (!ent->opts) {
- free(ent->fs_type);
- free(ent->fs_name);
- free(ent->path);
- free(ent);
- endmntent(tab);
- tree_free_mnt_tree(tree);
- return NULL;
+ if (ent->flags & MNTS_AUTOFS) {
+ if (strstr(mnt->mnt_opts, "indirect"))
+ ent->flags |= MNTS_INDIRECT;
+ else if (strstr(mnt->mnt_opts, "direct"))
+ ent->flags |= MNTS_DIRECT;
+ else if (strstr(mnt->mnt_opts, "offset"))
+ ent->flags |= MNTS_OFFSET;
}
- strcpy(ent->opts, mnt->mnt_opts);
mptr = tree;
while (mptr) {
@@ -1347,17 +1294,13 @@ int tree_is_mounted(struct mnt_list *mnt
mptr = list_entry(p, struct mnt_list, entries);
if (type) {
- unsigned int autofs_fs;
-
- autofs_fs = !strcmp(mptr->fs_type, "autofs");
-
if (type & MNTS_REAL) {
- if (!autofs_fs) {
+ if (mptr->flags & MNTS_AUTOFS) {
mounted = 1;
break;
}
} else if (type & MNTS_AUTOFS) {
- if (autofs_fs) {
+ if (mptr->flags & MNTS_AUTOFS) {
mounted = 1;
break;
}

View File

@ -0,0 +1,44 @@
autofs-5.1.5 - use ignore option for offset mounts as well
From: Ian Kent <raven@themaw.net>
The pseudo option "ignore" (that's used as a hint that applications
should ignore this mount when reporting a list of mounts) has been
added to direct and indirect mounts but hasn't been added to offset
mounts.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 10 ++++++++++
2 files changed, 11 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -61,6 +61,7 @@ xx/xx/2018 autofs-5.1.5
- fix amd entry memory leak.
- fix unlink_mount_tree() not umounting mounts.
- add ignore mount option.
+- use ignore option for offset mounts as well.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -756,6 +756,16 @@ int mount_autofs_offset(struct autofs_po
mp->options = tmp;
}
}
+
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
+ if (tmp) {
+ strcat(tmp, ",ignore");
+ mp->options = tmp;
+ }
+ }
}
strcpy(mountpoint, root);

View File

@ -0,0 +1,53 @@
autofs-5.1.5 - use local getmntent_r() in get_mnt_list()
From: Ian Kent <raven@themaw.net>
Change get_mnt_list() to use the local getmntent_r() instead of
the glibc version so that if glibc is changed to support the
autofs "ignore" hint automount(8) won't be affected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -73,6 +73,7 @@ xx/xx/2018 autofs-5.1.5
- use single unlink_umount_tree() for both direct and indirect mounts.
- move unlink_mount_tree() to lib/mounts.c.
- use local_getmntent_r() for unlink_mount_tree().
+- use local getmntent_r() in get_mnt_list().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -956,14 +956,14 @@ struct mnt_list *get_mnt_list(const char
if (!path || !pathlen || pathlen > PATH_MAX)
return NULL;
- tab = open_setmntent_r(_PROC_MOUNTS);
+ tab = open_fopen_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
- logerr("setmntent: %s", estr);
+ logerr("fopen: %s", estr);
return NULL;
}
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
len = strlen(mnt->mnt_dir);
if ((!include && len <= pathlen) ||
@@ -1020,7 +1020,7 @@ struct mnt_list *get_mnt_list(const char
ent->flags |= MNTS_OFFSET;
}
}
- endmntent(tab);
+ fclose(tab);
return list;
}

View File

@ -0,0 +1,53 @@
autofs-5.1.5 - use local getmntent_r in table_is_mounted()
From: Ian Kent <raven@themaw.net>
Use the local_getmntent_r() funtion copied from glibc in the function
table_is_mounted() so that if glibc is changed to support the autofs
"ignore" hint automount(8) won't be affected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -67,6 +67,7 @@ xx/xx/2018 autofs-5.1.5
- use mp instead of path in mnt_list entries.
- always use PROC_MOUNTS to make mount lists.
- add glibc getmntent_r().
+- use local getmntent_r in table_is_mounted().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -999,14 +999,14 @@ static int table_is_mounted(const char *
if (!mp || !mp_len || mp_len >= PATH_MAX)
return 0;
- tab = open_setmntent_r(_PROC_MOUNTS);
+ tab = open_fopen_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
- logerr("setmntent: %s", estr);
+ logerr("fopen: %s", estr);
return 0;
}
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
size_t len = strlen(mnt->mnt_dir);
if (type) {
@@ -1028,7 +1028,7 @@ static int table_is_mounted(const char *
break;
}
}
- endmntent(tab);
+ fclose(tab);
return ret;
}

View File

@ -0,0 +1,55 @@
autofs-5.1.5 - use local getmntent_r() in tree_make_mnt_list()
From: Ian Kent <raven@themaw.net>
Change tree_make_mnt_list() to use the local getmntent_r() instead of
the glibc version so that if glibc is changed to support the autofs
"ignore" hint automount(8) won't be affected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -74,6 +74,7 @@ xx/xx/2018 autofs-5.1.5
- move unlink_mount_tree() to lib/mounts.c.
- use local_getmntent_r() for unlink_mount_tree().
- use local getmntent_r() in get_mnt_list().
+- use local getmntent_r() in tree_make_mnt_list().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -1182,16 +1182,16 @@ struct mnt_list *tree_make_mnt_tree(cons
size_t plen;
int eq;
- tab = open_setmntent_r(_PROC_MOUNTS);
+ tab = open_fopen_r(_PROC_MOUNTS);
if (!tab) {
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
- logerr("setmntent: %s", estr);
+ logerr("fopen: %s", estr);
return NULL;
}
plen = strlen(path);
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
size_t len = strlen(mnt->mnt_dir);
/* Not matching path */
@@ -1283,7 +1283,7 @@ struct mnt_list *tree_make_mnt_tree(cons
if (!tree)
tree = ent;
}
- endmntent(tab);
+ fclose(tab);
return tree;
}

View File

@ -0,0 +1,179 @@
autofs-5.1.5 - use local_getmntent_r() for unlink_mount_tree()
From: Ian Kent <raven@themaw.net>
Now that unlink_mount_tree() is located in a single location and
only one function is used for this, change it to use our local
getmntent_r() function so that if glibc is changed to support the
autofs "ignore" hint automount(8) won't be affected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 24 ++++++------------------
daemon/indirect.c | 17 ++++++-----------
include/mounts.h | 2 +-
lib/mounts.c | 45 ++++++++++++++++++++++++++++++++++-----------
5 files changed, 48 insertions(+), 41 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -72,6 +72,7 @@ xx/xx/2018 autofs-5.1.5
- don't use tree_is_mounted() for mounted checks.
- use single unlink_umount_tree() for both direct and indirect mounts.
- move unlink_mount_tree() to lib/mounts.c.
+- use local_getmntent_r() for unlink_mount_tree().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -286,8 +286,6 @@ int do_mount_autofs_direct(struct autofs
if (ret == 0)
return -1;
} else {
- struct mnt_list *mnts;
-
if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
time_t tout = get_exp_timeout(ap, me->source);
int save_ioctlfd, ioctlfd;
@@ -313,22 +311,12 @@ int do_mount_autofs_direct(struct autofs
return 0;
}
- mnts = get_mnt_list(me->key, 1);
- if (mnts) {
- /*
- * A return of 1 indicates we successfully unlinked
- * the mount tree if there was one. A return of 0
- * indicates we failed to unlink the mount tree so
- * we have to return a failure.
- */
- ret = unlink_mount_tree(ap, mnts);
- free_mnt_list(mnts);
- if (!ret) {
- error(ap->logopt,
- "already mounted as other than autofs "
- "or failed to unlink entry in tree");
- return -1;
- }
+ ret = unlink_mount_tree(ap, ap->path);
+ if (!ret) {
+ error(ap->logopt,
+ "already mounted as other than autofs "
+ "or failed to unlink entry in tree");
+ goto out_err;
}
if (me->ioctlfd != -1) {
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -50,7 +50,6 @@ static int do_mount_autofs_indirect(stru
const char *map_name = hosts_map_name;
const char *type;
struct stat st;
- struct mnt_list *mnts;
int ret;
int err;
@@ -70,16 +69,12 @@ static int do_mount_autofs_indirect(stru
if (ret == 0)
return -1;
} else {
- mnts = get_mnt_list(ap->path, 1);
- if (mnts) {
- ret = unlink_mount_tree(ap, mnts);
- free_mnt_list(mnts);
- if (!ret) {
- error(ap->logopt,
- "already mounted as other than autofs "
- "or failed to unlink entry in tree");
- goto out_err;
- }
+ ret = unlink_mount_tree(ap, ap->path);
+ if (!ret) {
+ error(ap->logopt,
+ "already mounted as other than autofs "
+ "or failed to unlink entry in tree");
+ goto out_err;
}
}
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -100,7 +100,7 @@ int ext_mount_add(struct list_head *, co
int ext_mount_remove(struct list_head *, const char *);
int ext_mount_inuse(const char *);
struct mnt_list *get_mnt_list(const char *path, int include);
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
+int unlink_mount_tree(struct autofs_point *ap, const char *mp);
void free_mnt_list(struct mnt_list *list);
int is_mounted(const char *mp, unsigned int type);
void tree_free_mnt_tree(struct mnt_list *tree);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -881,21 +881,44 @@ local_getmntent_r(FILE *tab, struct mnte
return mnt;
}
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
+int unlink_mount_tree(struct autofs_point *ap, const char *mp)
{
- struct mnt_list *this;
- int rv, ret;
+ FILE *tab;
+ struct mntent *mnt;
+ struct mntent mnt_wrk;
+ char buf[PATH_MAX * 3];
+ unsigned int mp_len = strlen(mp);
+ int rv, ret = 1;
- ret = 1;
- this = mnts;
- while (this) {
- if (this->flags & MNTS_AUTOFS)
- rv = umount2(this->mp, MNT_DETACH);
+ tab = open_fopen_r(_PROC_MOUNTS);
+ if (!tab) {
+ char *estr = strerror_r(errno, buf, PATH_MAX - 1);
+ logerr("fopen: %s", estr);
+ return 0;
+ }
+
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
+ unsigned int mnt_dir_len;
+ int is_autofs;
+
+ if (strncmp(mnt->mnt_dir, mp, mp_len))
+ continue;
+
+ mnt_dir_len = strlen(mnt->mnt_dir);
+ is_autofs = !strcmp(mnt->mnt_type, "autofs");
+
+ if (mnt_dir_len == mp_len && !is_autofs) {
+ ret = 0;
+ break;
+ }
+
+ if (is_autofs)
+ rv = umount2(mnt->mnt_dir, MNT_DETACH);
else
- rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
+ rv = spawn_umount(ap->logopt, "-l", mnt->mnt_dir, NULL);
if (rv == -1) {
debug(ap->logopt,
- "can't unlink %s from mount tree", this->mp);
+ "can't unlink %s from mount tree", mnt->mnt_dir);
switch (errno) {
case EINVAL:
@@ -910,8 +933,8 @@ int unlink_mount_tree(struct autofs_poin
break;
}
}
- this = this->next;
}
+ fclose(tab);
return ret;
}

View File

@ -0,0 +1,161 @@
autofs-5.1.5 - use malloc(3) in spawn.c
From: Ian Kent <raven@themaw.net>
Use malloc(3) in spawn.c functions instead of alloca(3) as a failure
return for this function is undefined.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 45 insertions(+), 6 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -46,6 +46,7 @@ xx/xx/2018 autofs-5.1.5
- add systemd service command line option.
- support strictexpire mount option.
- add NULL check for get_addr_string() return.
+- use malloc(3) in spawn.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/spawn.c
+++ autofs-5.1.4/daemon/spawn.c
@@ -521,22 +521,33 @@ int spawnv(unsigned logopt, const char *
int spawnl(unsigned logopt, const char *prog, ...)
{
va_list arg;
- int argc;
+ int argc, ret;
char **argv, **p;
+ unsigned int argv_len;
va_start(arg, prog);
for (argc = 1; va_arg(arg, char *); argc++);
va_end(arg);
- if (!(argv = alloca(sizeof(char *) * argc)))
+ argv_len = sizeof(char *) * (argc + 1);
+ argv = malloc(argv_len);
+ if (!argv) {
+ char buf[MAX_ERR_BUF];
+ char *estr = strerror_r(errno, buf, sizeof(buf));
+ crit(logopt, "malloc: %s", estr);
return -1;
+ }
+ memset(argv, 0, argv_len);
va_start(arg, prog);
p = argv;
while ((*p++ = va_arg(arg, char *)));
va_end(arg);
- return do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
+ ret = do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
+ free(argv);
+
+ return ret;
}
int spawn_mount(unsigned logopt, ...)
@@ -554,6 +565,7 @@ int spawn_mount(unsigned logopt, ...)
int update_mtab = 1, ret, printed = 0;
unsigned int wait = defaults_get_mount_wait();
char buf[PATH_MAX + 1];
+ unsigned int argv_len;
/* If we use mount locking we can't validate the location */
#ifdef ENABLE_MOUNT_LOCKING
@@ -579,8 +591,15 @@ int spawn_mount(unsigned logopt, ...)
}
/* Alloc 1 extra slot in case we need to use the "-f" option */
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
+ argv_len = sizeof(char *) * (argc + 2);
+ argv = malloc(argv_len);
+ if (!argv) {
+ char buf[MAX_ERR_BUF];
+ char *estr = strerror_r(errno, buf, sizeof(buf));
+ crit(logopt, "malloc: %s", estr);
return -1;
+ }
+ memset(argv, 0, argv_len);
argv[0] = arg0;
@@ -655,6 +674,7 @@ int spawn_mount(unsigned logopt, ...)
umount(argv[argc]);
ret = MNT_FORCE_FAIL;
}
+ free(argv);
return ret;
}
@@ -683,6 +703,7 @@ int spawn_bind_mount(unsigned logopt, ..
int update_mtab = 1, ret, printed = 0;
unsigned int wait = defaults_get_mount_wait();
char buf[PATH_MAX + 1];
+ unsigned int argv_len;
/* If we use mount locking we can't validate the location */
#ifdef ENABLE_MOUNT_LOCKING
@@ -711,8 +732,15 @@ int spawn_bind_mount(unsigned logopt, ..
}
}
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
+ argv_len = sizeof(char *) * (argc + 2);
+ argv = malloc(argv_len);
+ if (!argv) {
+ char buf[MAX_ERR_BUF];
+ char *estr = strerror_r(errno, buf, sizeof(buf));
+ crit(logopt, "malloc: %s", estr);
return -1;
+ }
+ memset(argv, 0, argv_len);
argv[0] = arg0;
argv[1] = bind;
@@ -774,6 +802,7 @@ int spawn_bind_mount(unsigned logopt, ..
umount(argv[argc]);
ret = MNT_FORCE_FAIL;
}
+ free(argv);
return ret;
}
@@ -796,6 +825,7 @@ int spawn_umount(unsigned logopt, ...)
int update_mtab = 1, ret, printed = 0;
unsigned int wait = defaults_get_umount_wait();
char buf[PATH_MAX + 1];
+ unsigned int argv_len;
#ifdef ENABLE_MOUNT_LOCKING
options = SPAWN_OPT_LOCK;
@@ -821,8 +851,15 @@ int spawn_umount(unsigned logopt, ...)
if (arg_c)
argc++;;
- if (!(argv = alloca(sizeof(char *) * (argc + 1))))
+ argv_len = sizeof(char *) * (argc + 1);
+ argv = malloc(argv_len);
+ if (!argv) {
+ char buf[MAX_ERR_BUF];
+ char *estr = strerror_r(errno, buf, sizeof(buf));
+ crit(logopt, "malloc: %s", estr);
return -1;
+ }
+ memset(argv, 0, argv_len);
p = argv;
*p++ = arg0;
@@ -870,6 +907,7 @@ int spawn_umount(unsigned logopt, ...)
"and /etc/mtab will differ");
ret = 0;
}
+ free(argv);
return ret;
}

View File

@ -0,0 +1,436 @@
autofs-5.1.5 - use mp instead of path in mnt_list entries
From: Ian Kent <raven@themaw.net>
Use the simpler, more instructive mp instead of path in the
mnt_list structure.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/direct.c | 18 ++++++-------
daemon/indirect.c | 22 ++++++++--------
include/mounts.h | 4 +--
lib/mounts.c | 70 +++++++++++++++++++++++++++---------------------------
5 files changed, 58 insertions(+), 57 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -64,6 +64,7 @@ xx/xx/2018 autofs-5.1.5
- use ignore option for offset mounts as well.
- add config option for "ignore" mount option
- use bit flags for autofs mount types in mnt_list.
+- use mp instead of path in mnt_list entries.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -272,12 +272,12 @@ static int unlink_mount_tree(struct auto
mnt = list_entry(p, struct mnt_list, list);
if (mnt->flags & MNTS_AUTOFS)
- rv = umount2(mnt->path, MNT_DETACH);
+ rv = umount2(mnt->mp, MNT_DETACH);
else
- rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
+ rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);
if (rv == -1) {
debug(ap->logopt,
- "can't unlink %s from mount tree", mnt->path);
+ "can't unlink %s from mount tree", mnt->mp);
switch (errno) {
case EINVAL:
@@ -920,7 +920,7 @@ void *expire_proc_direct(void *arg)
*/
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
master_source_readlock(ap->entry);
- me = lookup_source_mapent(ap, next->path, LKP_DISTINCT);
+ me = lookup_source_mapent(ap, next->mp, LKP_DISTINCT);
pthread_cleanup_pop(1);
if (!me)
continue;
@@ -937,7 +937,7 @@ void *expire_proc_direct(void *arg)
*/
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
if (next->flags & MNTS_INDIRECT) {
- master_notify_submount(ap, next->path, ap->state);
+ master_notify_submount(ap, next->mp, ap->state);
pthread_setcancelstate(cur_state, NULL);
continue;
}
@@ -968,7 +968,7 @@ void *expire_proc_direct(void *arg)
cache_writelock(me->mc);
if (me->ioctlfd != -1 &&
fstat(me->ioctlfd, &st) != -1 &&
- !count_mounts(ap, next->path, st.st_dev)) {
+ !count_mounts(ap, next->mp, st.st_dev)) {
ops->close(ap->logopt, me->ioctlfd);
me->ioctlfd = -1;
cache_unlock(me->mc);
@@ -979,7 +979,7 @@ void *expire_proc_direct(void *arg)
ioctlfd = me->ioctlfd;
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
if (ret) {
left++;
pthread_setcancelstate(cur_state, NULL);
@@ -1002,10 +1002,10 @@ void *expire_proc_direct(void *arg)
if (ap->state == ST_EXPIRE || ap->state == ST_PRUNE)
pthread_testcancel();
- debug(ap->logopt, "send expire to trigger %s", next->path);
+ debug(ap->logopt, "send expire to trigger %s", next->mp);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
if (ret)
left++;
pthread_setcancelstate(cur_state, NULL);
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -49,12 +49,12 @@ static int unlink_mount_tree(struct auto
this = mnts;
while (this) {
if (this->flags & MNTS_AUTOFS)
- rv = umount2(this->path, MNT_DETACH);
+ rv = umount2(this->mp, MNT_DETACH);
else
- rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
+ rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
if (rv == -1) {
debug(ap->logopt,
- "can't unlink %s from mount tree", this->path);
+ "can't unlink %s from mount tree", this->mp);
switch (errno) {
case EINVAL:
@@ -446,7 +446,7 @@ void *expire_proc_indirect(void *arg)
*/
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
if (next->flags & MNTS_INDIRECT)
- master_notify_submount(ap, next->path, ap->state);
+ master_notify_submount(ap, next->mp, ap->state);
else if (next->flags & MNTS_OFFSET) {
struct map_source *map;
struct mapent_cache *mc = NULL;
@@ -454,13 +454,13 @@ void *expire_proc_indirect(void *arg)
struct stat st;
/* It's got a mount, deal with in the outer loop */
- if (is_mounted(_PATH_MOUNTED, next->path, MNTS_REAL)) {
+ if (is_mounted(_PATH_MOUNTED, next->mp, MNTS_REAL)) {
pthread_setcancelstate(cur_state, NULL);
continue;
}
/* Don't touch submounts */
- if (master_find_submount(ap, next->path)) {
+ if (master_find_submount(ap, next->mp)) {
pthread_setcancelstate(cur_state, NULL);
continue;
}
@@ -471,7 +471,7 @@ void *expire_proc_indirect(void *arg)
while (map) {
mc = map->mc;
cache_writelock(mc);
- me = cache_lookup_distinct(mc, next->path);
+ me = cache_lookup_distinct(mc, next->mp);
if (me)
break;
cache_unlock(mc);
@@ -513,7 +513,7 @@ void *expire_proc_indirect(void *arg)
* If the mount corresponds to an offset trigger then
* the key is the path, otherwise it's the last component.
*/
- ind_key = strrchr(next->path, '/');
+ ind_key = strrchr(next->mp, '/');
if (ind_key)
ind_key++;
@@ -526,7 +526,7 @@ void *expire_proc_indirect(void *arg)
*/
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
master_source_readlock(ap->entry);
- me = lookup_source_mapent(ap, next->path, LKP_DISTINCT);
+ me = lookup_source_mapent(ap, next->mp, LKP_DISTINCT);
if (!me && ind_key)
me = lookup_source_mapent(ap, ind_key, LKP_NORMAL);
pthread_cleanup_pop(1);
@@ -538,10 +538,10 @@ void *expire_proc_indirect(void *arg)
cache_unlock(me->mc);
}
- debug(ap->logopt, "expire %s", next->path);
+ debug(ap->logopt, "expire %s", next->mp);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
if (ret)
left++;
pthread_setcancelstate(cur_state, NULL);
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -52,7 +52,7 @@ extern const unsigned int t_offset;
struct mapent;
struct mnt_list {
- char *path;
+ char *mp;
unsigned int flags;
/*
* List operations ie. get_mnt_list.
@@ -101,7 +101,7 @@ int ext_mount_remove(struct list_head *,
int ext_mount_inuse(const char *);
struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
void free_mnt_list(struct mnt_list *list);
-int is_mounted(const char *table, const char *path, unsigned int type);
+int is_mounted(const char *table, const char *mp, unsigned int type);
void tree_free_mnt_tree(struct mnt_list *tree);
struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -817,8 +817,8 @@ struct mnt_list *get_mnt_list(const char
strncmp(mnt->mnt_dir, path, pathlen) != 0)
continue;
- /* Not a subdirectory of requested path ? */
- /* pathlen == 1 => everything is subdir */
+ /* Not a subdirectory of requested mp? */
+ /* mp_len == 1 => everything is subdir */
if (pathlen > 1 && len > pathlen &&
mnt->mnt_dir[pathlen] != '/')
continue;
@@ -834,7 +834,7 @@ struct mnt_list *get_mnt_list(const char
mptr = list;
last = NULL;
while (mptr) {
- if (len >= strlen(mptr->path))
+ if (len >= strlen(mptr->mp))
break;
last = mptr;
mptr = mptr->next;
@@ -847,13 +847,13 @@ struct mnt_list *get_mnt_list(const char
ent->next = mptr;
- ent->path = malloc(len + 1);
- if (!ent->path) {
+ ent->mp = malloc(len + 1);
+ if (!ent->mp) {
endmntent(tab);
free_mnt_list(list);
return NULL;
}
- strcpy(ent->path, mnt->mnt_dir);
+ strcpy(ent->mp, mnt->mnt_dir);
if (!strcmp(mnt->mnt_type, "autofs"))
ent->flags |= MNTS_AUTOFS;
@@ -885,23 +885,23 @@ void free_mnt_list(struct mnt_list *list
next = this->next;
- if (this->path)
- free(this->path);
+ if (this->mp)
+ free(this->mp);
free(this);
}
}
-static int table_is_mounted(const char *table, const char *path, unsigned int type)
+static int table_is_mounted(const char *table, const char *mp, unsigned int type)
{
struct mntent *mnt;
struct mntent mnt_wrk;
char buf[PATH_MAX * 3];
- size_t pathlen = strlen(path);
+ size_t mp_len = strlen(mp);
FILE *tab;
int ret = 0;
- if (!path || !pathlen || pathlen >= PATH_MAX)
+ if (!mp || !mp_len || mp_len >= PATH_MAX)
return 0;
tab = open_setmntent_r(table);
@@ -928,7 +928,7 @@ static int table_is_mounted(const char *
continue;
}
- if (pathlen == len && !strncmp(path, mnt->mnt_dir, pathlen)) {
+ if (mp_len == len && !strncmp(mp, mnt->mnt_dir, mp_len)) {
ret = 1;
break;
}
@@ -938,7 +938,7 @@ static int table_is_mounted(const char *
return ret;
}
-static int ioctl_is_mounted(const char *table, const char *path, unsigned int type)
+static int ioctl_is_mounted(const char *table, const char *mp, unsigned int type)
{
struct ioctl_ops *ops = get_ioctl_ops();
unsigned int mounted;
@@ -947,9 +947,9 @@ static int ioctl_is_mounted(const char *
/* If the ioctl fails fall back to the potentially resource
* intensive mount table check.
*/
- ret = ops->ismountpoint(LOGOPT_NONE, -1, path, &mounted);
+ ret = ops->ismountpoint(LOGOPT_NONE, -1, mp, &mounted);
if (ret == -1)
- return table_is_mounted(table, path, type);
+ return table_is_mounted(table, mp, type);
if (mounted) {
switch (type) {
@@ -964,14 +964,14 @@ static int ioctl_is_mounted(const char *
return 0;
}
-int is_mounted(const char *table, const char *path, unsigned int type)
+int is_mounted(const char *table, const char *mp, unsigned int type)
{
struct ioctl_ops *ops = get_ioctl_ops();
if (ops->ismountpoint)
- return ioctl_is_mounted(table, path, type);
+ return ioctl_is_mounted(table, mp, type);
else
- return table_is_mounted(table, path, type);
+ return table_is_mounted(table, mp, type);
}
/*
@@ -1006,12 +1006,12 @@ void tree_free_mnt_tree(struct mnt_list
list_del(&this->self);
- free(this->path);
+ free(this->mp);
free(this);
}
- free(tree->path);
+ free(tree->mp);
free(tree);
}
@@ -1062,14 +1062,14 @@ struct mnt_list *tree_make_mnt_tree(cons
INIT_LIST_HEAD(&ent->entries);
INIT_LIST_HEAD(&ent->sublist);
- ent->path = malloc(len + 1);
- if (!ent->path) {
+ ent->mp = malloc(len + 1);
+ if (!ent->mp) {
endmntent(tab);
free(ent);
tree_free_mnt_tree(tree);
return NULL;
}
- strcpy(ent->path, mnt->mnt_dir);
+ strcpy(ent->mp, mnt->mnt_dir);
if (!strcmp(mnt->mnt_type, "autofs"))
ent->flags |= MNTS_AUTOFS;
@@ -1085,8 +1085,8 @@ struct mnt_list *tree_make_mnt_tree(cons
mptr = tree;
while (mptr) {
- int elen = strlen(ent->path);
- int mlen = strlen(mptr->path);
+ int elen = strlen(ent->mp);
+ int mlen = strlen(mptr->mp);
if (elen < mlen) {
if (mptr->left) {
@@ -1106,7 +1106,7 @@ struct mnt_list *tree_make_mnt_tree(cons
}
}
- eq = strcmp(ent->path, mptr->path);
+ eq = strcmp(ent->mp, mptr->mp);
if (eq < 0) {
if (mptr->left)
mptr = mptr->left;
@@ -1146,7 +1146,7 @@ int tree_get_mnt_list(struct mnt_list *m
return 0;
plen = strlen(path);
- mlen = strlen(mnts->path);
+ mlen = strlen(mnts->mp);
if (mlen < plen)
return tree_get_mnt_list(mnts->right, list, path, include);
else {
@@ -1155,10 +1155,10 @@ int tree_get_mnt_list(struct mnt_list *m
tree_get_mnt_list(mnts->left, list, path, include);
if ((!include && mlen <= plen) ||
- strncmp(mnts->path, path, plen))
+ strncmp(mnts->mp, path, plen))
goto skip;
- if (plen > 1 && mlen > plen && mnts->path[plen] != '/')
+ if (plen > 1 && mlen > plen && mnts->mp[plen] != '/')
goto skip;
INIT_LIST_HEAD(&mnts->list);
@@ -1193,7 +1193,7 @@ int tree_get_mnt_sublist(struct mnt_list
return 0;
plen = strlen(path);
- mlen = strlen(mnts->path);
+ mlen = strlen(mnts->mp);
if (mlen < plen)
return tree_get_mnt_sublist(mnts->right, list, path, include);
else {
@@ -1202,10 +1202,10 @@ int tree_get_mnt_sublist(struct mnt_list
tree_get_mnt_sublist(mnts->left, list, path, include);
if ((!include && mlen <= plen) ||
- strncmp(mnts->path, path, plen))
+ strncmp(mnts->mp, path, plen))
goto skip;
- if (plen > 1 && mlen > plen && mnts->path[plen] != '/')
+ if (plen > 1 && mlen > plen && mnts->mp[plen] != '/')
goto skip;
INIT_LIST_HEAD(&mnts->sublist);
@@ -1237,7 +1237,7 @@ int tree_find_mnt_ents(struct mnt_list *
return 0;
plen = strlen(path);
- mlen = strlen(mnts->path);
+ mlen = strlen(mnts->mp);
if (mlen < plen)
return tree_find_mnt_ents(mnts->right, list, path);
else if (mlen > plen)
@@ -1247,7 +1247,7 @@ int tree_find_mnt_ents(struct mnt_list *
tree_find_mnt_ents(mnts->left, list, path);
- if (!strcmp(mnts->path, path)) {
+ if (!strcmp(mnts->mp, path)) {
INIT_LIST_HEAD(&mnts->entries);
list_add(&mnts->entries, list);
}
@@ -1258,7 +1258,7 @@ int tree_find_mnt_ents(struct mnt_list *
this = list_entry(p, struct mnt_list, self);
- if (!strcmp(this->path, path)) {
+ if (!strcmp(this->mp, path)) {
INIT_LIST_HEAD(&this->entries);
list_add(&this->entries, list);
}

View File

@ -0,0 +1,271 @@
autofs-5.1.5 - use single unlink_umount_tree() for both direct and indirect mounts
From: Ian Kent <raven@themaw.net>
Use the same function, unlink_umount_tree(), for forced unlink of mounts
for both indirect and direct mounts.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/direct.c | 96 +++++++++++++---------------------------------------
daemon/indirect.c | 2 -
daemon/state.c | 17 +--------
include/automount.h | 2 -
5 files changed, 30 insertions(+), 88 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -70,6 +70,7 @@ xx/xx/2018 autofs-5.1.5
- use local getmntent_r in table_is_mounted().
- refactor unlink_active_mounts() in direct.c.
- don't use tree_is_mounted() for mounted checks.
+- use single unlink_umount_tree() for both direct and indirect mounts.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -49,6 +49,8 @@ pthread_key_t key_mnt_direct_params;
pthread_key_t key_mnt_offset_params;
pthread_once_t key_mnt_params_once = PTHREAD_ONCE_INIT;
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
+
static void key_mnt_params_destroy(void *arg)
{
struct mnt_params *mp;
@@ -256,64 +258,8 @@ done:
return 0;
}
-static int unlink_mount_tree(struct autofs_point *ap, struct list_head *list)
-{
- struct list_head *p;
- int rv, ret;
-
- ret = 1;
- list_for_each(p, list) {
- struct mnt_list *mnt;
-
- mnt = list_entry(p, struct mnt_list, list);
-
- if (mnt->flags & MNTS_AUTOFS)
- rv = umount2(mnt->mp, MNT_DETACH);
- else
- rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);
- if (rv == -1) {
- debug(ap->logopt,
- "can't unlink %s from mount tree", mnt->mp);
-
- switch (errno) {
- case EINVAL:
- warn(ap->logopt,
- "bad superblock or not mounted");
- break;
-
- case ENOENT:
- case EFAULT:
- ret = 0;
- warn(ap->logopt, "bad path for mount");
- break;
- }
- }
- }
- return ret;
-}
-
-static int unlink_active_mounts(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
-{
- struct list_head list;
-
- INIT_LIST_HEAD(&list);
-
- if (!tree_get_mnt_list(mnts, &list, me->key, 1))
- return 1;
-
- if (!unlink_mount_tree(ap, &list)) {
- debug(ap->logopt,
- "already mounted as other than autofs "
- "or failed to unlink entry in tree");
- return 0;
- }
-
- return 1;
-}
-
int do_mount_autofs_direct(struct autofs_point *ap,
- struct mnt_list *mnts, struct mapent *me,
- time_t timeout)
+ struct mapent *me, time_t timeout)
{
const char *str_direct = mount_type_str(t_direct);
struct ioctl_ops *ops = get_ioctl_ops();
@@ -342,6 +288,8 @@ int do_mount_autofs_direct(struct autofs
if (ret == 0)
return -1;
} else {
+ struct mnt_list *mnts;
+
if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
time_t tout = get_exp_timeout(ap, me->source);
int save_ioctlfd, ioctlfd;
@@ -367,15 +315,23 @@ int do_mount_autofs_direct(struct autofs
return 0;
}
- /*
- * A return of 1 indicates we successfully unlinked
- * the mount tree if there was one. A return of 0
- * indicates we failed to unlink the mount tree so
- * we have to return a failure.
- */
- ret = unlink_active_mounts(ap, mnts, me);
- if (!ret)
- return -1;
+ mnts = get_mnt_list(me->key, 1);
+ if (mnts) {
+ /*
+ * A return of 1 indicates we successfully unlinked
+ * the mount tree if there was one. A return of 0
+ * indicates we failed to unlink the mount tree so
+ * we have to return a failure.
+ */
+ ret = unlink_mount_tree(ap, mnts);
+ free_mnt_list(mnts);
+ if (!ret) {
+ error(ap->logopt,
+ "already mounted as other than autofs "
+ "or failed to unlink entry in tree");
+ return -1;
+ }
+ }
if (me->ioctlfd != -1) {
error(ap->logopt, "active direct mount %s", me->key);
@@ -494,7 +450,6 @@ int mount_autofs_direct(struct autofs_po
struct map_source *map;
struct mapent_cache *nc, *mc;
struct mapent *me, *ne, *nested;
- struct mnt_list *mnts;
time_t now = monotonic_time(NULL);
if (strcmp(ap->path, "/-")) {
@@ -510,8 +465,6 @@ int mount_autofs_direct(struct autofs_po
return -1;
}
- mnts = tree_make_mnt_tree("/");
- pthread_cleanup_push(mnts_cleanup, mnts);
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
master_source_readlock(ap->entry);
nc = ap->entry->master->nc;
@@ -539,7 +492,7 @@ int mount_autofs_direct(struct autofs_po
if (ne) {
if (map->master_line < ne->age) {
/* TODO: check return, locking me */
- do_mount_autofs_direct(ap, mnts, me, timeout);
+ do_mount_autofs_direct(ap, me, timeout);
}
me = cache_enumerate(mc, me);
continue;
@@ -556,7 +509,7 @@ int mount_autofs_direct(struct autofs_po
}
/* TODO: check return, locking me */
- do_mount_autofs_direct(ap, mnts, me, timeout);
+ do_mount_autofs_direct(ap, me, timeout);
me = cache_enumerate(mc, me);
}
@@ -565,7 +518,6 @@ int mount_autofs_direct(struct autofs_po
}
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
return 0;
}
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -40,7 +40,7 @@
/* Attribute to create detached thread */
extern pthread_attr_t th_attr_detached;
-static int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
{
struct mnt_list *this;
int rv, ret;
--- autofs-5.1.4.orig/daemon/state.c
+++ autofs-5.1.4/daemon/state.c
@@ -350,14 +350,7 @@ static void do_readmap_cleanup(void *arg
return;
}
-static void tree_mnts_cleanup(void *arg)
-{
- struct mnt_list *mnts = (struct mnt_list *) arg;
- tree_free_mnt_tree(mnts);
- return;
-}
-
-static void do_readmap_mount(struct autofs_point *ap, struct mnt_list *mnts,
+static void do_readmap_mount(struct autofs_point *ap,
struct map_source *map, struct mapent *me, time_t now)
{
struct mapent_cache *nc;
@@ -444,7 +437,7 @@ static void do_readmap_mount(struct auto
debug(ap->logopt,
"%s is mounted", me->key);
} else
- do_mount_autofs_direct(ap, mnts, me, get_exp_timeout(ap, map));
+ do_mount_autofs_direct(ap, me, get_exp_timeout(ap, map));
return;
}
@@ -455,7 +448,6 @@ static void *do_readmap(void *arg)
struct map_source *map;
struct mapent_cache *nc, *mc;
struct readmap_args *ra;
- struct mnt_list *mnts;
int status;
time_t now;
@@ -499,8 +491,6 @@ static void *do_readmap(void *arg)
struct mapent *me;
unsigned int append_alarm = !ap->exp_runfreq;
- mnts = tree_make_mnt_tree("/");
- pthread_cleanup_push(tree_mnts_cleanup, mnts);
nc = ap->entry->master->nc;
cache_readlock(nc);
pthread_cleanup_push(cache_lock_cleanup, nc);
@@ -518,7 +508,7 @@ static void *do_readmap(void *arg)
cache_readlock(mc);
me = cache_enumerate(mc, NULL);
while (me) {
- do_readmap_mount(ap, mnts, map, me, now);
+ do_readmap_mount(ap, map, me, now);
me = cache_enumerate(mc, me);
}
lookup_prune_one_cache(ap, map->mc, now);
@@ -538,7 +528,6 @@ static void *do_readmap(void *arg)
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
}
pthread_cleanup_pop(1);
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -606,7 +606,7 @@ void *expire_proc_indirect(void *);
void *expire_proc_direct(void *);
int expire_offsets_direct(struct autofs_point *ap, struct mapent *me, int now);
int mount_autofs_indirect(struct autofs_point *ap, const char *root);
-int do_mount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me, time_t timeout);
+int do_mount_autofs_direct(struct autofs_point *ap, struct mapent *me, time_t timeout);
int mount_autofs_direct(struct autofs_point *ap);
int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *root, const char *offset);
void submount_signal_parent(struct autofs_point *ap, unsigned int success);

View File

@ -0,0 +1,202 @@
autofs-5.1.6 - add a hash index to mnt_list
From: Ian Kent <raven@themaw.net>
Add a hash index (and utility functions) to struct mnt_list.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
include/mounts.h | 8 +++
lib/mounts.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 144 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -121,6 +121,7 @@ xx/xx/2018 autofs-5.1.5
- change mountpoint to mp in struct ext_mount.
- make external mounts independent of amd_entry.
- make external mounts use simpler hashtable.
+- add a hash index to mnt_list.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -54,10 +54,16 @@ struct mapent;
struct mnt_list {
char *mp;
unsigned int flags;
+
+ /* Hash of all mounts */
+ struct hlist_node hash;
+ unsigned int ref;
+
/*
* List operations ie. get_mnt_list.
*/
struct mnt_list *next;
+
/*
* Tree operations ie. tree_make_tree,
* tree_get_mnt_list etc.
@@ -100,6 +106,8 @@ char *make_mnt_name_string(char *path);
int ext_mount_add(const char *, const char *);
int ext_mount_remove(const char *);
int ext_mount_inuse(const char *);
+struct mnt_list *mnts_lookup_mount(const char *mp);
+void mnts_put_mount(struct mnt_list *mnt);
struct mnt_list *get_mnt_list(const char *path, int include);
int unlink_mount_tree(struct autofs_point *ap, const char *mp);
void free_mnt_list(struct mnt_list *list);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -63,6 +63,11 @@ struct ext_mount {
static DEFINE_HASHTABLE(ext_mounts_hash, EXT_MOUNTS_HASH_BITS);
static pthread_mutex_t ext_mount_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
+#define MNTS_HASH_BITS 7
+
+static DEFINE_HASHTABLE(mnts_hash, MNTS_HASH_BITS);
+static pthread_mutex_t mnts_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
+
unsigned int linux_version_code(void)
{
struct utsname my_utsname;
@@ -832,6 +837,136 @@ done:
return ret;
}
+static void mnts_hash_mutex_lock(void)
+{
+ int status = pthread_mutex_lock(&mnts_hash_mutex);
+ if (status)
+ fatal(status);
+}
+
+static void mnts_hash_mutex_unlock(void)
+{
+ int status = pthread_mutex_unlock(&mnts_hash_mutex);
+ if (status)
+ fatal(status);
+}
+
+static struct mnt_list *mnts_lookup(const char *mp)
+{
+ uint32_t hval = hash(mp, HASH_SIZE(mnts_hash));
+ struct mnt_list *this;
+
+ if (hlist_empty(&mnts_hash[hval]))
+ return NULL;
+
+ hlist_for_each_entry(this, &mnts_hash[hval], hash) {
+ if (!strcmp(this->mp, mp) && this->ref)
+ return this;
+ }
+
+ return NULL;
+}
+
+static struct mnt_list *mnts_alloc_mount(const char *mp)
+{
+ struct mnt_list *this;
+
+ this = malloc(sizeof(*this));
+ if (!this)
+ goto done;
+ memset(this, 0, sizeof(*this));
+
+ this->mp = strdup(mp);
+ if (!this->mp) {
+ free(this);
+ this = NULL;
+ goto done;
+ }
+
+ this->ref = 1;
+ INIT_HLIST_NODE(&this->hash);
+done:
+ return this;
+}
+
+static void __mnts_get_mount(struct mnt_list *mnt)
+{
+ mnt->ref++;
+}
+
+static void __mnts_put_mount(struct mnt_list *mnt)
+{
+ mnt->ref--;
+ if (!mnt->ref) {
+ hash_del(&mnt->hash);
+ free(mnt->mp);
+ free(mnt);
+ }
+}
+
+static struct mnt_list *mnts_new_mount(const char *mp)
+{
+ struct mnt_list *this;
+
+ this = mnts_lookup(mp);
+ if (this) {
+ __mnts_get_mount(this);
+ goto done;
+ }
+
+ this = mnts_alloc_mount(mp);
+ if (!this)
+ goto done;
+
+ hash_add_str(mnts_hash, &this->hash, this->mp);
+done:
+ return this;
+}
+
+static struct mnt_list *mnts_get_mount(const char *mp)
+{
+ struct mnt_list *this;
+
+ this = mnts_lookup(mp);
+ if (this) {
+ __mnts_get_mount(this);
+ return this;
+ }
+
+ return mnts_new_mount(mp);
+}
+
+static struct mnt_list *__mnts_lookup_mount(const char *mp)
+{
+ struct mnt_list *this;
+
+ this = mnts_lookup(mp);
+ if (this)
+ __mnts_get_mount(this);
+
+ return this;
+}
+
+struct mnt_list *mnts_lookup_mount(const char *mp)
+{
+ struct mnt_list *this;
+
+ mnts_hash_mutex_lock();
+ this = __mnts_lookup_mount(mp);
+ mnts_hash_mutex_unlock();
+
+ return this;
+}
+
+void mnts_put_mount(struct mnt_list *mnt)
+{
+ if (!mnt)
+ return;
+ mnts_hash_mutex_lock();
+ __mnts_put_mount(mnt);
+ mnts_hash_mutex_unlock();
+}
+
/* From glibc decode_name() */
/* Since the values in a line are separated by spaces, a name cannot
* contain a space. Therefore some programs encode spaces in names

View File

@ -0,0 +1,248 @@
autofs-5.1.6 - add force unlink mounts and exit option
From: Ian Kent <raven@themaw.net>
Add a automount program option to force an unlink umount of all
existing mounts under configured autofs mount points then exit.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 51 +++++++++++++++++++++++++++++++++------------------
daemon/direct.c | 12 +++++++++++-
daemon/indirect.c | 21 ++++++++++++++++-----
include/automount.h | 1 +
lib/master.c | 6 ++++--
man/automount.8 | 6 ++++++
7 files changed, 72 insertions(+), 26 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -89,6 +89,7 @@ xx/xx/2018 autofs-5.1.5
- use bit flag for force unlink mounts.
- improve force unlink option description.
- remove command fifo on autofs mount fail.
+- add force unlink mounts and exit option.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -1153,8 +1153,13 @@ static int mount_autofs(struct autofs_po
{
int status = 0;
- if (autofs_init_ap(ap) != 0)
- return -1;
+ /* No need to create comms fds and command fifo if
+ * unlinking mounts and exiting.
+ */
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
+ if (autofs_init_ap(ap) != 0)
+ return -1;
+ }
if (ap->type == LKP_DIRECT)
status = mount_autofs_direct(ap);
@@ -1859,7 +1864,8 @@ void *handle_mounts(void *arg)
}
if (mount_autofs(ap, root) < 0) {
- crit(ap->logopt, "mount of %s failed!", ap->path);
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
+ crit(ap->logopt, "mount of %s failed!", ap->path);
suc->status = 1;
umount_autofs(ap, root, 1);
free(root);
@@ -1951,6 +1957,7 @@ static void usage(void)
" -C --dont-check-daemon\n"
" don't check if daemon is already running\n"
" -F --force forceably clean up known automounts at start\n"
+ " -U --force-exit forceably clean up known automounts and exit\n"
" -V --version print version, build config and exit\n"
, program);
}
@@ -2202,7 +2209,7 @@ int main(int argc, char *argv[])
time_t timeout;
time_t age = monotonic_time(NULL);
struct rlimit rlim;
- const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFUM";
static const struct option long_options[] = {
{"help", 0, 0, 'h'},
{"pid-file", 1, 0, 'p'},
@@ -2220,6 +2227,7 @@ int main(int argc, char *argv[])
{"set-log-priority", 1, 0, 'l'},
{"dont-check-daemon", 0, 0, 'C'},
{"force", 0, 0, 'F'},
+ {"force-exit", 0, 0, 'U'},
{"master-wait", 1, 0, 'M'},
{0, 0, 0, 0}
};
@@ -2342,6 +2350,11 @@ int main(int argc, char *argv[])
do_force_unlink = UNLINK_AND_CONT;
break;
+ case 'U':
+ flags |= DAEMON_FLAGS_FOREGROUND;
+ do_force_unlink = UNLINK_AND_EXIT;
+ break;
+
case '?':
case ':':
printf("%s: Ambiguous or unknown options\n", program);
@@ -2657,25 +2670,27 @@ int main(int argc, char *argv[])
}
}
- /*
- * Mmm ... reset force unlink umount so we don't also do this
- * in future when we receive a HUP signal.
- */
- do_force_unlink = 0;
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
+ /*
+ * Mmm ... reset force unlink umount so we don't also do
+ * this in future when we receive a HUP signal.
+ */
+ do_force_unlink = 0;
- if (start_pipefd[1] != -1) {
- st_stat = 0;
- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
- close(start_pipefd[1]);
- }
+ if (start_pipefd[1] != -1) {
+ st_stat = 0;
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
+ close(start_pipefd[1]);
+ }
#ifdef WITH_SYSTEMD
- if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
- sd_notify(1, "READY=1");
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
+ sd_notify(1, "READY=1");
#endif
- state_mach_thid = pthread_self();
- statemachine(NULL);
+ state_mach_thid = pthread_self();
+ statemachine(NULL);
+ }
master_kill(master_list);
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -286,7 +286,14 @@ int do_mount_autofs_direct(struct autofs
if (ret == 0)
return -1;
} else {
- if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
+ /* I don't remember why this is here for the force
+ * unlink case. I don't think it should be but I may
+ * have done it for a reason so keep it for the unlink
+ * and continue case but not for the unlink and exit
+ * case.
+ */
+ if (!(do_force_unlink & UNLINK_AND_EXIT) &&
+ ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
time_t tout = get_exp_timeout(ap, me->source);
int save_ioctlfd, ioctlfd;
@@ -319,6 +326,9 @@ int do_mount_autofs_direct(struct autofs
goto out_err;
}
+ if (do_force_unlink & UNLINK_AND_EXIT)
+ return -1;
+
if (me->ioctlfd != -1) {
error(ap->logopt, "active direct mount %s", me->key);
return -1;
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -76,6 +76,9 @@ static int do_mount_autofs_indirect(stru
"or failed to unlink entry in tree");
goto out_err;
}
+
+ if (do_force_unlink & UNLINK_AND_EXIT)
+ return -1;
}
options = make_options_string(ap->path,
@@ -163,12 +166,20 @@ int mount_autofs_indirect(struct autofs_
int status;
int map;
+ /* Don't read the map if the unlink and exit option has been
+ * given. do_mount_autofs_indirect() will return -1 if this
+ * option has been given so there's no need to do anything
+ * else.
+ */
+
/* TODO: read map, determine map type is OK */
- if (lookup_nss_read_map(ap, NULL, now))
- lookup_prune_cache(ap, now);
- else {
- error(ap->logopt, "failed to read map for %s", ap->path);
- return -1;
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
+ if (lookup_nss_read_map(ap, NULL, now))
+ lookup_prune_cache(ap, now);
+ else {
+ error(ap->logopt, "failed to read map for %s", ap->path);
+ return -1;
+ }
}
status = do_mount_autofs_indirect(ap, root);
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -591,6 +591,7 @@ struct autofs_point {
};
#define UNLINK_AND_CONT 0x01
+#define UNLINK_AND_EXIT 0x02
/* Foreably unlink existing mounts at startup. */
extern int do_force_unlink;
--- autofs-5.1.4.orig/lib/master.c
+++ autofs-5.1.4/lib/master.c
@@ -1358,7 +1358,8 @@ static int master_do_mount(struct master
suc.done = 0;
suc.status = 0;
- debug(ap->logopt, "mounting %s", entry->path);
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
+ debug(ap->logopt, "mounting %s", entry->path);
status = pthread_create(&thid, &th_attr, handle_mounts, &suc);
if (status) {
@@ -1376,7 +1377,8 @@ static int master_do_mount(struct master
}
if (suc.status) {
- error(ap->logopt, "failed to startup mount");
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
+ error(ap->logopt, "failed to startup mount");
handle_mounts_startup_cond_destroy(&suc);
return 0;
}
--- autofs-5.1.4.orig/man/automount.8
+++ autofs-5.1.4/man/automount.8
@@ -121,6 +121,12 @@ Don't check if the daemon is currently r
Force an unlink umount of existing mounts under configured autofs managed
mount points during startup. This can cause problems for processes with
working directories within these mounts (see NOTES).
+.TP
+.I "\-U, \-\-force-exit"
+Force an unlink umount of existing mounts under configured autofs managed
+mount points and exit rather than continuing the startup. This can cause
+problems for processes with working directories within these mounts (see
+NOTES).
.SH ARGUMENTS
\fBautomount\fP takes one optional argument, the name of the master map to
use.

View File

@ -0,0 +1,334 @@
autofs-5.1.6 - add hashtable implementation
From: Ian Kent <raven@themaw.net>
Include the (slightly modified) Linux kernel hashtable implementation.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
include/automount.h | 19 -----
include/hash.h | 101 +++++++++++++++++++++++++++++++
include/hashtable.h | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 269 insertions(+), 18 deletions(-)
create mode 100644 include/hash.h
create mode 100644 include/hashtable.h
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -117,6 +117,7 @@ xx/xx/2018 autofs-5.1.5
- make bind mounts propagation slave by default.
- fix browse dir not re-created on symlink expire.
- update list.h.
+- add hashtable implementation.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/automount.h
+++ autofs-5.1.4/include/automount.h
@@ -22,6 +22,7 @@
#include <mntent.h>
#include "config.h"
#include "list.h"
+#include "hash.h"
#include <linux/auto_fs4.h>
@@ -143,24 +144,6 @@ struct autofs_point;
#define UMOUNT_RETRIES 8
#define EXPIRE_RETRIES 3
-static u_int32_t inline hash(const char *key, unsigned int size)
-{
- u_int32_t hashval;
- char *s = (char *) key;
-
- for (hashval = 0; *s != '\0';) {
- hashval += (unsigned char) *s++;
- hashval += (hashval << 10);
- hashval ^= (hashval >> 6);
- }
-
- hashval += (hashval << 3);
- hashval ^= (hashval >> 11);
- hashval += (hashval << 15);
-
- return hashval % size;
-}
-
struct mapent_cache {
pthread_rwlock_t rwlock;
unsigned int size;
--- /dev/null
+++ autofs-5.1.4/include/hash.h
@@ -0,0 +1,101 @@
+#ifndef _LINUX_HASH_H
+#define _LINUX_HASH_H
+/* Fast hashing routine for ints, longs and pointers.
+ (C) 2002 Nadia Yvette Chambers, IBM */
+
+#include <sys/types.h>
+#include <stdint.h>
+
+/*
+ * The "GOLDEN_RATIO_PRIME" is used in ifs/btrfs/brtfs_inode.h and
+ * fs/inode.c. It's not actually prime any more (the previous primes
+ * were actively bad for hashing), but the name remains.
+ */
+#if __WORDSIZE == 32
+#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_32
+#define hash_long(val, bits) hash_32(val, bits)
+#elif __WORDSIZE == 64
+#define hash_long(val, bits) hash_64(val, bits)
+#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_64
+#else
+#error Wordsize not 32 or 64
+#endif
+
+/* String based hash function */
+static uint32_t inline hash(const char *key, unsigned int size)
+{
+ u_int32_t hashval;
+ char *s = (char *) key;
+
+ for (hashval = 0; *s != '\0';) {
+ hashval += (unsigned char) *s++;
+ hashval += (hashval << 10);
+ hashval ^= (hashval >> 6);
+ }
+
+ hashval += (hashval << 3);
+ hashval ^= (hashval >> 11);
+ hashval += (hashval << 15);
+
+ return hashval % size;
+}
+
+/*
+ * This hash multiplies the input by a large odd number and takes the
+ * high bits. Since multiplication propagates changes to the most
+ * significant end only, it is essential that the high bits of the
+ * product be used for the hash value.
+ *
+ * Chuck Lever verified the effectiveness of this technique:
+ * http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
+ *
+ * Although a random odd number will do, it turns out that the golden
+ * ratio phi = (sqrt(5)-1)/2, or its negative, has particularly nice
+ * properties. (See Knuth vol 3, section 6.4, exercise 9.)
+ *
+ * These are the negative, (1 - phi) = phi**2 = (3 - sqrt(5))/2,
+ * which is very slightly easier to multiply by and makes no
+ * difference to the hash distribution.
+ */
+#define GOLDEN_RATIO_32 0x61C88647
+#define GOLDEN_RATIO_64 0x61C8864680B583EBull
+
+static inline uint32_t __hash_32(uint32_t val)
+{
+ return val * GOLDEN_RATIO_32;
+}
+
+static inline uint32_t hash_32(uint32_t val, unsigned int bits)
+{
+ /* High bits are more random, so use them. */
+ return __hash_32(val) >> (32 - bits);
+}
+
+static __always_inline uint32_t hash_64(uint64_t val, unsigned int bits)
+{
+#if __WORDSIZE == 64
+ /* 64x64-bit multiply is efficient on all 64-bit processors */
+ return val * GOLDEN_RATIO_64 >> (64 - bits);
+#else
+ /* Hash 64 bits using only 32x32-bit multiply. */
+ return hash_32((uint32_t) val ^ __hash_32(val >> 32), bits);
+#endif
+}
+
+static inline uint32_t hash_ptr(const void *ptr, unsigned int bits)
+{
+ return hash_long((unsigned long) ptr, bits);
+}
+
+/* This really should be called fold32_ptr; it does no hashing to speak of. */
+static inline uint32_t hash32_ptr(const void *ptr)
+{
+ unsigned long val = (unsigned long) ptr;
+
+#if __WORDSIZE == 64
+ val ^= (val >> 32);
+#endif
+ return (uint32_t) val;
+}
+
+#endif /* _LINUX_HASH_H */
--- /dev/null
+++ autofs-5.1.4/include/hashtable.h
@@ -0,0 +1,166 @@
+/*
+ * Statically sized hash table implementation
+ * (C) 2012 Sasha Levin <levinsasha928@gmail.com>
+ */
+
+#ifndef _LINUX_HASHTABLE_H
+#define _LINUX_HASHTABLE_H
+
+#include "list.h"
+#include "hash.h"
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
+#endif
+
+static inline unsigned int ilog2(unsigned long val) {
+ unsigned int ret = -1;
+
+ while (val != 0) {
+ val >>= 1;
+ ret++;
+ }
+ return ret;
+}
+
+#define DEFINE_HASHTABLE(name, bits) \
+ struct hlist_head name[1 << (bits)] = \
+ { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
+
+#define DECLARE_HASHTABLE(name, bits) \
+ struct hlist_head name[1 << (bits)]
+
+#define HASH_SIZE(name) (ARRAY_SIZE(name))
+#define HASH_BITS(name) ilog2(HASH_SIZE(name))
+
+/* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */
+#define hash_min(val, bits) \
+ (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
+
+static inline void __hash_init(struct hlist_head *ht, unsigned int sz)
+{
+ unsigned int i;
+
+ for (i = 0; i < sz; i++)
+ INIT_HLIST_HEAD(&ht[i]);
+}
+
+/**
+ * hash_init - initialize a hash table
+ * @hashtable: hashtable to be initialized
+ *
+ * Calculates the size of the hashtable from the given parameter, otherwise
+ * same as hash_init_size.
+ *
+ * This has to be a macro since HASH_BITS() will not work on pointers since
+ * it calculates the size during preprocessing.
+ */
+#define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
+
+/**
+ * hash_add - add an object to a hashtable
+ * @hashtable: hashtable to add to
+ * @node: the &struct hlist_node of the object to be added
+ * @key: the key of the object to be added
+ */
+#define hash_add(hashtable, node, key) \
+ hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
+
+/**
+ * hash_add_str - add a string object to a hashtable
+ * @hashtable: hashtable to add to
+ * @node: the &struct hlist_node of the object to be added
+ * @key: the string key of the object to be added
+ */
+#define hash_add_str(hashtable, node, key) \
+ hlist_add_head(node, &hashtable[hash(key, HASH_SIZE(hashtable))])
+
+/**
+ * hash_hashed - check whether an object is in any hashtable
+ * @node: the &struct hlist_node of the object to be checked
+ */
+static inline int hash_hashed(struct hlist_node *node)
+{
+ return !hlist_unhashed(node);
+}
+
+static inline int __hash_empty(struct hlist_head *ht, unsigned int sz)
+{
+ unsigned int i;
+
+ for (i = 0; i < sz; i++)
+ if (!hlist_empty(&ht[i]))
+ return 0;
+
+ return 1;
+}
+
+/**
+ * hash_empty - check whether a hashtable is empty
+ * @hashtable: hashtable to check
+ *
+ * This has to be a macro since HASH_BITS() will not work on pointers since
+ * it calculates the size during preprocessing.
+ */
+#define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable))
+
+/**
+ * hash_del - remove an object from a hashtable
+ * @node: &struct hlist_node of the object to remove
+ */
+static inline void hash_del(struct hlist_node *node)
+{
+ hlist_del_init(node);
+}
+
+/**
+ * hash_for_each - iterate over a hashtable
+ * @name: hashtable to iterate
+ * @bkt: integer to use as bucket loop cursor
+ * @obj: the type * to use as a loop cursor for each entry
+ * @member: the name of the hlist_node within the struct
+ */
+#define hash_for_each(name, bkt, obj, member) \
+ for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
+ (bkt)++)\
+ hlist_for_each_entry(obj, &name[bkt], member)
+
+/**
+ * hash_for_each_safe - iterate over a hashtable safe against removal of
+ * hash entry
+ * @name: hashtable to iterate
+ * @bkt: integer to use as bucket loop cursor
+ * @tmp: a &struct used for temporary storage
+ * @obj: the type * to use as a loop cursor for each entry
+ * @member: the name of the hlist_node within the struct
+ */
+#define hash_for_each_safe(name, bkt, tmp, obj, member) \
+ for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
+ (bkt)++)\
+ hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)
+
+/**
+ * hash_for_each_possible - iterate over all possible objects hashing to the
+ * same bucket
+ * @name: hashtable to iterate
+ * @obj: the type * to use as a loop cursor for each entry
+ * @member: the name of the hlist_node within the struct
+ * @key: the key of the objects to iterate over
+ */
+#define hash_for_each_possible(name, obj, member, key) \
+ hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member)
+
+/**
+ * hash_for_each_possible_safe - iterate over all possible objects hashing to the
+ * same bucket safe against removals
+ * @name: hashtable to iterate
+ * @obj: the type * to use as a loop cursor for each entry
+ * @tmp: a &struct used for temporary storage
+ * @member: the name of the hlist_node within the struct
+ * @key: the key of the objects to iterate over
+ */
+#define hash_for_each_possible_safe(name, obj, tmp, member, key) \
+ hlist_for_each_entry_safe(obj, tmp,\
+ &name[hash_min(key, HASH_BITS(name))], member)
+
+#endif

View File

@ -0,0 +1,225 @@
autofs-5.1.6 - add helper to construct mount point path
From: Ian Kent <raven@themaw.net>
Add convenience helper to construct mount point path.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/mounts.h | 3 +++
lib/mounts.c | 23 +++++++++++++++++++++++
modules/mount_bind.c | 19 +++++--------------
modules/mount_changer.c | 19 +++++--------------
modules/mount_ext2.c | 19 +++++--------------
modules/mount_generic.c | 19 +++++--------------
modules/mount_nfs.c | 21 ++++++++-------------
8 files changed, 55 insertions(+), 69 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -135,6 +135,7 @@ xx/xx/2018 autofs-5.1.5
- move submount check into conditional_alarm_add().
- move lib/master.c to daemon/master.c.
- use master_list_empty() for list empty check.
+- add helper to construct mount point path.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -94,6 +94,9 @@ unsigned int linux_version_code(void);
int check_nfs_mount_version(struct nfs_mount_vers *, struct nfs_mount_vers *);
extern unsigned int nfs_mount_uses_string_options;
+int mount_fullpath(char *fullpath, size_t max_len,
+ const char *root, const char *name);
+
struct amd_entry;
struct substvar *addstdenv(struct substvar *sv, const char *prefix);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -339,6 +339,29 @@ int check_nfs_mount_version(struct nfs_m
}
#endif
+int mount_fullpath(char *fullpath, size_t max_len,
+ const char *root, const char *name)
+{
+ int last, len;
+
+ last = strlen(root) - 1;
+
+ /* Root offset of multi-mount or direct or offset mount.
+ * Direct or offset mount, name (or root) is absolute path.
+ */
+ if (root[last] == '/' || *name == '/')
+ len = snprintf(fullpath, max_len, "%s", root);
+ else
+ len = snprintf(fullpath, max_len, "%s/%s", root, name);
+
+ if (len >= max_len)
+ return 0;
+
+ fullpath[len] = '\0';
+
+ return len;
+}
+
static char *set_env_name(const char *prefix, const char *name, char *buf)
{
size_t len;
--- autofs-5.1.4.orig/modules/mount_bind.c
+++ autofs-5.1.4/modules/mount_bind.c
@@ -122,21 +122,12 @@ int mount_mount(struct autofs_point *ap,
}
}
- /* Root offset of multi-mount */
- len = strlen(root);
- 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);
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
+ if (!len) {
+ error(ap->logopt,
+ MODPREFIX "mount point path too long");
+ return 1;
}
- fullpath[len] = '\0';
i = len;
while (--i > 0 && fullpath[i] == '/')
--- autofs-5.1.4.orig/modules/mount_changer.c
+++ autofs-5.1.4/modules/mount_changer.c
@@ -59,21 +59,12 @@ int mount_mount(struct autofs_point *ap,
fstype = "iso9660";
- /* Root offset of multi-mount */
- len = strlen(root);
- 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);
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
+ if (!len) {
+ error(ap->logopt,
+ MODPREFIX "mount point path too long");
+ return 1;
}
- fullpath[len] = '\0';
debug(ap->logopt, MODPREFIX "calling umount %s", what);
--- autofs-5.1.4.orig/modules/mount_ext2.c
+++ autofs-5.1.4/modules/mount_ext2.c
@@ -55,21 +55,12 @@ int mount_mount(struct autofs_point *ap,
if (defaults_get_mount_verbose())
mountlog = &log_info;
- /* Root offset of multi-mount */
- len = strlen(root);
- 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);
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
+ if (!len) {
+ error(ap->logopt,
+ MODPREFIX "mount point path too long");
+ return 1;
}
- fullpath[len] = '\0';
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
--- autofs-5.1.4.orig/modules/mount_generic.c
+++ autofs-5.1.4/modules/mount_generic.c
@@ -54,21 +54,12 @@ int mount_mount(struct autofs_point *ap,
if (defaults_get_mount_verbose())
mountlog = &log_info;
- /* Root offset of multi-mount */
- len = strlen(root);
- 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);
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
+ if (!len) {
+ error(ap->logopt,
+ MODPREFIX "mount point path too long");
+ return 1;
}
- fullpath[len] = '\0';
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
--- autofs-5.1.4.orig/modules/mount_nfs.c
+++ autofs-5.1.4/modules/mount_nfs.c
@@ -212,6 +212,14 @@ int mount_mount(struct autofs_point *ap,
nfsoptions, nobind, nosymlink, ro);
}
+ /* Construct mount point directory */
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
+ if (!len) {
+ error(ap->logopt,
+ MODPREFIX "mount point path too long");
+ return 1;
+ }
+
if (!parse_location(ap->logopt, &hosts, what, flags)) {
info(ap->logopt, MODPREFIX "no hosts available");
return 1;
@@ -266,19 +274,6 @@ dont_probe:
return 1;
}
- /* Construct and perhaps create mount point directory */
-
- /* Root offset of multi-mount */
- len = strlen(root);
- if (root[len - 1] == '/') {
- len = snprintf(fullpath, len, "%s", root);
- } else if (*name == '/') {
- len = sprintf(fullpath, "%s", root);
- } else {
- len = sprintf(fullpath, "%s/%s", root, name);
- }
- fullpath[len] = '\0';
-
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
status = mkdir_path(fullpath, mp_mode);

View File

@ -0,0 +1,66 @@
autofs-5.1.6 - add sss ECONREFUSED return handling
From: Ian Kent <raven@themaw.net>
The sss library has returned ECONNREFUSED for the case of sssd not
running for a long time now but autofs doesn't catch it, fix that.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_sss.c | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 5a3d785..2a45829 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -94,6 +94,7 @@ xx/xx/2018 autofs-5.1.5
- fix lookup_nss_read_master() nsswicth check return.
- fix typo in open_sss_lib().
- fix sss_master_map_wait timing.
+- add sss ECONREFUSED return handling.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
index fbb6193..c393296 100644
--- a/modules/lookup_sss.c
+++ b/modules/lookup_sss.c
@@ -297,6 +297,9 @@ int lookup_read_master(struct master *master, time_t age, void *context)
if (ret) {
unsigned int retries;
+ if (ret == ECONNREFUSED)
+ return NSS_STATUS_UNKNOWN;
+
if (ret != ENOENT)
return NSS_STATUS_UNAVAIL;
@@ -308,6 +311,8 @@ int lookup_read_master(struct master *master, time_t age, void *context)
ctxt, ctxt->mapname, &sss_ctxt,
retries);
if (ret) {
+ if (ret == ECONNREFUSED)
+ return NSS_STATUS_UNKNOWN;
if (ret == ENOENT)
return NSS_STATUS_NOTFOUND;
return NSS_STATUS_UNAVAIL;
@@ -415,6 +420,8 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
ret = setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt);
if (ret) {
+ if (ret == ECONNREFUSED)
+ return NSS_STATUS_UNKNOWN;
if (ret == ENOENT)
return NSS_STATUS_NOTFOUND;
return NSS_STATUS_UNAVAIL;
@@ -525,6 +532,8 @@ static int lookup_one(struct autofs_point *ap,
ret = setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt);
if (ret) {
+ if (ret == ECONNREFUSED)
+ return NSS_STATUS_UNKNOWN;
if (ret == ENOENT)
return NSS_STATUS_NOTFOUND;
return NSS_STATUS_UNAVAIL;

View File

@ -0,0 +1,120 @@
autofs-5.1.6 - add support for new sss autofs proto version call
From: Ian Kent <raven@themaw.net>
Add sss protocol feature version function existence check and local get
function.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_sss.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 1830730..7c22aa1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -96,6 +96,7 @@ xx/xx/2018 autofs-5.1.5
- fix sss_master_map_wait timing.
- add sss ECONREFUSED return handling.
- use mapname in sss context for setautomntent().
+- add support for new sss autofs proto version call.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
index c44c55d..3819981 100644
--- a/modules/lookup_sss.c
+++ b/modules/lookup_sss.c
@@ -37,11 +37,29 @@
#define SSS_SO_NAME "libsss_autofs"
+/* If the sss library protocol version is greater than 0 there are
+ * more possibile error returns from the sss autofs library calls.
+ *
+ * If ECONNREFUSED is returned then sssd is not running or not
+ * configured on the system, immediately return an unavailable
+ * status.
+ *
+ * A return of EHOSTDOWN means sss backend server is down so we
+ * should retry.
+ *
+ * With older sss ilibrary we can get a return of ENOENT for the
+ * above cases so also wait in that case since we can't be sure
+ * the map doesn't exist.
+ */
+#define SSS_PROTO_VERSION 1
+
+unsigned int _sss_auto_protocol_version(unsigned int);
int _sss_setautomntent(const char *, void **);
int _sss_getautomntent_r(char **, char **, void *);
int _sss_getautomntbyname_r(char *, char **, void *);
int _sss_endautomntent(void **);
+typedef unsigned int (*protocol_version_t) (unsigned int);
typedef int (*setautomntent_t) (const char *, void **);
typedef int (*getautomntent_t) (char **, char **, void *);
typedef int (*getautomntbyname_t) (char *, char **, void *);
@@ -50,6 +68,7 @@ typedef int (*endautomntent_t) (void **);
struct lookup_context {
const char *mapname;
void *dlhandle;
+ protocol_version_t protocol_version;
setautomntent_t setautomntent;
getautomntent_t getautomntent_r;
getautomntbyname_t getautomntbyname_r;
@@ -58,6 +77,8 @@ struct lookup_context {
};
int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
+int sss_proto_version = SSS_PROTO_VERSION; /* 0 => initial version,
+ * >= 1 => new error handling. */
static int open_sss_lib(struct lookup_context *ctxt)
{
@@ -78,6 +99,11 @@ static int open_sss_lib(struct lookup_context *ctxt)
return 1;
ctxt->dlhandle = dh;
+ /* Don't fail on NULL, it's simply not present in this version of the
+ * sss autofs library.
+ */
+ ctxt->protocol_version = (protocol_version_t) dlsym(dh, "_sss_auto_protocol_version");
+
ctxt->setautomntent = (setautomntent_t) dlsym(dh, "_sss_setautomntent");
if (!ctxt->setautomntent)
goto lib_names_fail;
@@ -193,6 +219,7 @@ int lookup_reinit(const char *mapfmt,
}
new->dlhandle = ctxt->dlhandle;
+ new->protocol_version = ctxt->protocol_version;
new->setautomntent = ctxt->setautomntent;
new->getautomntent_r = ctxt->getautomntent_r;
new->getautomntbyname_r = ctxt->getautomntbyname_r;
@@ -219,6 +246,23 @@ static int setautomntent(unsigned int logopt,
return ret;
}
+static unsigned int proto_version(struct lookup_context *ctxt)
+{
+ unsigned int proto_version = 0;
+
+ if (ctxt->protocol_version) {
+ /* If ctxt->protocol_version() is defined it's assumed
+ * that for sss_proto_version <= sss autofs library
+ * protocol version ctxt->protocol_version() will
+ * return the version requested by autofs to indicate
+ * it userstands what the autofs module is capable of
+ * handling.
+ */
+ proto_version = ctxt->protocol_version(sss_proto_version);
+ }
+ return proto_version;
+}
+
static int setautomntent_wait(unsigned int logopt,
struct lookup_context *ctxt,
void **sss_ctxt, unsigned int retries)

View File

@ -0,0 +1,74 @@
autofs-5.1.6 - change mountpoint to mp in struct ext_mount
From: Ian Kent <raven@themaw.net>
Use simple name mp instead of mountpoint in struct ext_mount.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 14 +++++++-------
2 files changed, 8 insertions(+), 7 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -118,6 +118,7 @@ xx/xx/2018 autofs-5.1.5
- fix browse dir not re-created on symlink expire.
- update list.h.
- add hashtable implementation.
+- change mountpoint to mp in struct ext_mount.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -54,7 +54,7 @@ static size_t maxgrpbuf = 0;
#define EXT_MOUNTS_HASH_SIZE 50
struct ext_mount {
- char *mountpoint;
+ char *mp;
unsigned int umount;
struct list_head mount;
struct list_head mounts;
@@ -743,9 +743,9 @@ static void ext_mounts_hash_init(void)
ext_mounts_hash_init_done = 1;
}
-static struct ext_mount *ext_mount_lookup(const char *mountpoint)
+static struct ext_mount *ext_mount_lookup(const char *mp)
{
- u_int32_t hval = hash(mountpoint, EXT_MOUNTS_HASH_SIZE);
+ u_int32_t hval = hash(mp, EXT_MOUNTS_HASH_SIZE);
struct list_head *p, *head;
if (!ext_mounts_hash_init_done)
@@ -757,7 +757,7 @@ static struct ext_mount *ext_mount_looku
head = &ext_mounts_hash[hval];
list_for_each(p, head) {
struct ext_mount *this = list_entry(p, struct ext_mount, mount);
- if (!strcmp(this->mountpoint, mountpoint))
+ if (!strcmp(this->mp, mp))
return this;
}
return NULL;
@@ -788,8 +788,8 @@ int ext_mount_add(struct list_head *entr
if (!em)
goto done;
- em->mountpoint = strdup(path);
- if (!em->mountpoint) {
+ em->mp = strdup(path);
+ if (!em->mp) {
free(em);
goto done;
}
@@ -828,7 +828,7 @@ int ext_mount_remove(struct list_head *e
if (em->umount)
ret = 1;
if (list_empty(&em->mount)) {
- free(em->mountpoint);
+ free(em->mp);
free(em);
}
}

View File

@ -0,0 +1,101 @@
autofs-5.1.6 - cleanup stale logpri fifo pipes on unlink and exit
From: Ian Kent <raven@themaw.net>
If the unlink and exit option is given then stale fifo pipe files
need to be cleaned up since the entire tree of mounts below autofs
managed directories will be unlinked as well as the autofs mounts
themselves.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 52 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -90,6 +90,7 @@ xx/xx/2018 autofs-5.1.5
- improve force unlink option description.
- remove command fifo on autofs mount fail.
- add force unlink mounts and exit option.
+- cleanup stale logpri fifo pipes on unlink and exit.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -60,7 +60,8 @@ unsigned int nfs_mount_uses_string_optio
static struct nfs_mount_vers vers, check = {1, 1, 1};
/* autofs fifo name prefix */
-const char *fifodir = AUTOFS_FIFO_DIR "/autofs.fifo";
+#define FIFO_NAME_PREFIX "autofs.fifo"
+const char *fifodir = AUTOFS_FIFO_DIR "/" FIFO_NAME_PREFIX;
const char *global_options; /* Global option, from command line */
@@ -887,6 +888,48 @@ out_free:
return ret;
}
+static void cleanup_stale_logpri_fifo_pipes(void)
+{
+ size_t prefix_len = strlen(FIFO_NAME_PREFIX);
+ char *dir = AUTOFS_FIFO_DIR;
+ size_t dir_len = strlen(dir);
+ struct dirent *dent;
+ DIR *dfd;
+ int ret;
+
+ dfd = opendir(dir);
+ if (!dfd) {
+ warn(LOGOPT_ANY, "failed to open fifo dir %s", dir);
+ return;
+ }
+
+ while ((dent = readdir(dfd))) {
+ char fifo_path[PATH_MAX];
+
+ if (!(dent->d_type & DT_FIFO))
+ continue;
+ if (strncmp(FIFO_NAME_PREFIX, dent->d_name, prefix_len))
+ continue;
+ if ((dir_len + 1 + strlen(dent->d_name)) >= PATH_MAX) {
+ warn(LOGOPT_ANY, "fifo path too long for buffer");
+ continue;
+ }
+
+ strcpy(fifo_path, dir);
+ strcat(fifo_path, "/");
+ strcat(fifo_path, dent->d_name);
+
+ ret = unlink(fifo_path);
+ if (ret == -1) {
+ char buf[MAX_ERR_BUF];
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ warn(LOGOPT_ANY, "unlink of fifo failed: %s", estr);
+ }
+ }
+
+ closedir(dfd);
+}
+
static void handle_fifo_message(struct autofs_point *ap, int fd)
{
int ret;
@@ -2670,7 +2713,13 @@ int main(int argc, char *argv[])
}
}
- if (!(do_force_unlink & UNLINK_AND_EXIT)) {
+ /* If the option to unlink all autofs mounts and exit has
+ * been given remove logpri fifo files as all the mounts
+ * will be detached leaving them stale.
+ */
+ if (do_force_unlink & UNLINK_AND_EXIT)
+ cleanup_stale_logpri_fifo_pipes();
+ else {
/*
* Mmm ... reset force unlink umount so we don't also do
* this in future when we receive a HUP signal.

View File

@ -0,0 +1,49 @@
autofs-5.1.6 - dont prune offset map entries
From: Ian Kent <raven@themaw.net>
Indirect maps create offset map entries for multi-mount map entries on
deamnd and remove them when they expire.
Since they are created based on an owning map entry they don't correspond
to an actual map entry so they, and their owning map entry, should never
be pruned.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/lookup.c | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 3608345..34b160e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -109,6 +109,7 @@ xx/xx/2018 autofs-5.1.5
- refactor sss getautomntbyname().
- improve sss getautomntbyname() error handling.
- use a valid timeout in lookup_prune_one_cache().
+- dont prune offset map entries.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/lookup.c b/daemon/lookup.c
index 8bf1335..2de622e 100644
--- a/daemon/lookup.c
+++ b/daemon/lookup.c
@@ -1355,6 +1355,15 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti
}
if (ap->type == LKP_INDIRECT) {
+ /* Don't prune offset map entries since they are
+ * created on demand and managed by expire and don't
+ * prune the multi-map owner map entry.
+ */
+ if (*me->key == '/' || me->multi == me) {
+ me = cache_enumerate(mc, me);
+ continue;
+ }
+
/* If the map hasn't been read (nobrowse
* indirect mounts) then keep cached entries
* for POSITIVE_TIMEOUT.

View File

@ -0,0 +1,310 @@
autofs-5.1.6 - fix a regression with map instance lookup
From: Ian Kent <raven@themaw.net>
Commit b66deff4241d ("autofs-5.1.3 - fix possible map instance memory
leak") introduced a regression.
The change didn't fix the memory leak and also failed to fix the race
updating the map instance list that caused it.
To fix this get rid of the horible temporary map usage and update the
instance list in place. Doing this causes some additional allocations
and frees but is somewhat simpler overall and avoids the race.
Fixes: b66deff4241d ("autofs-5.1.3 - fix possible map instance memory leak")
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/lookup.c | 180 +++++++++++++++++++++++---------------------------------
2 files changed, 76 insertions(+), 105 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -76,6 +76,7 @@ xx/xx/2018 autofs-5.1.5
- use local getmntent_r() in get_mnt_list().
- use local getmntent_r() in tree_make_mnt_list().
- fix missing initialization of autofs_point flags.
+- fix a regression with map instance lookup.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/lookup.c
+++ autofs-5.1.4/daemon/lookup.c
@@ -64,6 +64,10 @@ static char *find_map_path(struct autofs
char *search_path;
struct stat st;
+ /* Absolute path, just return a copy */
+ if (mname[0] == '/')
+ return strdup(mname);
+
/*
* This is different to the way it is in amd.
* autofs will always try to locate maps in AUTOFS_MAP_DIR
@@ -373,14 +377,27 @@ static int read_file_source_instance(str
char src_prog[] = "program";
struct stat st;
char *type, *format;
+ char *path;
+
+ if (map->argc < 1) {
+ error(ap->logopt, "invalid arguments for autofs_point");
+ return NSS_STATUS_UNKNOWN;
+ }
- if (stat(map->argv[0], &st) == -1) {
- warn(ap->logopt, "file map %s not found", map->argv[0]);
+ path = find_map_path(ap, map);
+ if (!path)
+ return NSS_STATUS_UNKNOWN;
+
+ if (stat(path, &st) == -1) {
+ warn(ap->logopt, "file map %s not found", path);
+ free(path);
return NSS_STATUS_NOTFOUND;
}
- if (!S_ISREG(st.st_mode))
+ if (!S_ISREG(st.st_mode)) {
+ free(path);
return NSS_STATUS_NOTFOUND;
+ }
if (st.st_mode & __S_IEXEC)
type = src_prog;
@@ -391,9 +408,23 @@ static int read_file_source_instance(str
instance = master_find_source_instance(map, type, format, 0, NULL);
if (!instance) {
- int argc = map->argc;
- const char **argv = map->argv;
+ const char **argv;
+ int argc;
+
+ argc = map->argc;
+ argv = copy_argv(map->argc, map->argv);
+ if (!argv) {
+ error(ap->logopt, "failed to copy args");
+ free(path);
+ return NSS_STATUS_UNKNOWN;
+ }
+ if (argv[0])
+ free((char *) argv[0]);
+ argv[0] = path;
+ path = NULL;
+
instance = master_add_source_instance(map, type, format, age, argc, argv);
+ free_argv(argc, argv);
if (!instance)
return NSS_STATUS_UNAVAIL;
instance->recurse = map->recurse;
@@ -401,6 +432,9 @@ static int read_file_source_instance(str
}
instance->stale = map->stale;
+ if (path)
+ free(path);
+
return do_read_map(ap, instance, age);
}
@@ -476,16 +510,11 @@ static int lookup_map_read_map(struct au
static enum nsswitch_status read_map_source(struct nss_source *this,
struct autofs_point *ap, struct map_source *map, time_t age)
{
- enum nsswitch_status result;
- struct map_source tmap;
- char *path;
-
if (strcasecmp(this->source, "files")) {
return read_source_instance(ap, map, this->source, age);
}
/*
- * autofs built-in map for nsswitch "files" is "file".
* This is a special case as we need to append the
* normal location to the map name.
* note: It's invalid to specify a relative path.
@@ -496,50 +525,7 @@ static enum nsswitch_status read_map_sou
return NSS_STATUS_NOTFOUND;
}
- this->source[4] = '\0';
- tmap.flags = map->flags;
- tmap.type = this->source;
- tmap.format = map->format;
- tmap.name = map->name;
- tmap.lookup = map->lookup;
- tmap.mc = map->mc;
- tmap.instance = map->instance;
- tmap.exp_timeout = map->exp_timeout;
- tmap.recurse = map->recurse;
- tmap.depth = map->depth;
- tmap.stale = map->stale;
- tmap.argc = 0;
- tmap.argv = NULL;
-
- path = find_map_path(ap, map);
- if (!path)
- return NSS_STATUS_UNKNOWN;
-
- if (map->argc >= 1) {
- tmap.argc = map->argc;
- tmap.argv = copy_argv(map->argc, map->argv);
- if (!tmap.argv) {
- error(ap->logopt, "failed to copy args");
- free(path);
- return NSS_STATUS_UNKNOWN;
- }
- if (tmap.argv[0])
- free((char *) tmap.argv[0]);
- tmap.argv[0] = path;
- } else {
- error(ap->logopt, "invalid arguments for autofs_point");
- free(path);
- return NSS_STATUS_UNKNOWN;
- }
-
- pthread_cleanup_push(argv_cleanup, &tmap);
- result = read_file_source_instance(ap, &tmap, age);
- pthread_cleanup_pop(1);
-
- if (!map->instance)
- map->instance = tmap.instance;
-
- return result;
+ return read_file_source_instance(ap, map, age);
}
int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time_t age)
@@ -925,17 +911,30 @@ static int lookup_name_file_source_insta
time_t age = monotonic_time(NULL);
struct stat st;
char *type, *format;
+ char *path;
if (*name == '/' && map->flags & MAP_FLAG_FORMAT_AMD)
return lookup_amd_instance(ap, map, name, name_len);
- if (stat(map->argv[0], &st) == -1) {
+ if (map->argc < 1) {
+ error(ap->logopt, "invalid arguments for autofs_point");
+ return NSS_STATUS_UNKNOWN;
+ }
+
+ path = find_map_path(ap, map);
+ if (!path)
+ return NSS_STATUS_UNKNOWN;
+
+ if (stat(path, &st) == -1) {
debug(ap->logopt, "file map not found");
+ free(path);
return NSS_STATUS_NOTFOUND;
}
- if (!S_ISREG(st.st_mode))
+ if (!S_ISREG(st.st_mode)) {
+ free(path);
return NSS_STATUS_NOTFOUND;
+ }
if (st.st_mode & __S_IEXEC)
type = src_prog;
@@ -946,15 +945,32 @@ static int lookup_name_file_source_insta
instance = master_find_source_instance(map, type, format, 0, NULL);
if (!instance) {
- int argc = map->argc;
- const char **argv = map->argv;
+ const char **argv;
+ int argc;
+
+ argc = map->argc;
+ argv = copy_argv(map->argc, map->argv);
+ if (!argv) {
+ error(ap->logopt, "failed to copy args");
+ free(path);
+ return NSS_STATUS_UNKNOWN;
+ }
+ if (argv[0])
+ free((char *) argv[0]);
+ argv[0] = path;
+ path = NULL;
+
instance = master_add_source_instance(map, type, format, age, argc, argv);
+ free_argv(argc, argv);
if (!instance)
return NSS_STATUS_NOTFOUND;
instance->recurse = map->recurse;
instance->depth = map->depth;
}
+ if (path)
+ free(path);
+
return do_lookup_mount(ap, instance, name, name_len);
}
@@ -1030,10 +1046,6 @@ static enum nsswitch_status lookup_map_n
struct autofs_point *ap, struct map_source *map,
const char *name, int name_len)
{
- enum nsswitch_status result;
- struct map_source tmap;
- char *path;
-
if (strcasecmp(this->source, "files"))
return lookup_name_source_instance(ap, map,
this->source, name, name_len);
@@ -1050,49 +1062,7 @@ static enum nsswitch_status lookup_map_n
return NSS_STATUS_NOTFOUND;
}
- this->source[4] = '\0';
- tmap.flags = map->flags;
- tmap.type = this->source;
- tmap.format = map->format;
- tmap.name = map->name;
- tmap.mc = map->mc;
- tmap.instance = map->instance;
- tmap.exp_timeout = map->exp_timeout;
- tmap.recurse = map->recurse;
- tmap.depth = map->depth;
- tmap.argc = 0;
- tmap.argv = NULL;
-
- path = find_map_path(ap, map);
- if (!path)
- return NSS_STATUS_UNKNOWN;
-
- if (map->argc >= 1) {
- tmap.argc = map->argc;
- tmap.argv = copy_argv(map->argc, map->argv);
- if (!tmap.argv) {
- error(ap->logopt, "failed to copy args");
- free(path);
- return NSS_STATUS_UNKNOWN;
- }
- if (tmap.argv[0])
- free((char *) tmap.argv[0]);
- tmap.argv[0] = path;
- } else {
- error(ap->logopt, "invalid arguments for autofs_point");
- free(path);
- return NSS_STATUS_UNKNOWN;
- }
-
- result = lookup_name_file_source_instance(ap, &tmap, name, name_len);
-
- if (!map->instance)
- map->instance = tmap.instance;
-
- /* path is freed in free_argv */
- free_argv(tmap.argc, tmap.argv);
-
- return result;
+ return lookup_name_file_source_instance(ap, map, name, name_len);
}
static struct map_source *lookup_get_map_source(struct master_mapent *entry)

View File

@ -0,0 +1,273 @@
autofs-5.1.6 - fix autofs mount options construction
From: Ian Kent <raven@themaw.net>
There's an off by one length error in the autofs mount options
construction.
Consolidate the options construction into make_options_string() and
use snprintf() to verify the options length calculation is correct.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
daemon/direct.c | 46 ++-----------------------
daemon/indirect.c | 23 +-----------
include/mounts.h | 3 +
lib/mounts.c | 98 +++++++++++++++++++++++++++++++++++++++++++++---------
5 files changed, 92 insertions(+), 79 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -80,6 +80,7 @@ xx/xx/2018 autofs-5.1.5
- fix trailing dollar sun entry expansion.
- initialize struct addrinfo for getaddrinfo() calls.
- fix quoted string length calc in expandsunent().
+- fix autofs mount options construction.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -348,29 +348,10 @@ int do_mount_autofs_direct(struct autofs
}
if (!mp->options) {
- mp->options = make_options_string(ap->path, ap->kpipefd, str_direct);
+ mp->options = make_options_string(ap->path,
+ ap->kpipefd, str_direct, ap->flags);
if (!mp->options)
return 0;
-
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(mp->options, strlen(mp->options) + 12);
- if (tmp) {
- strcat(tmp, ",strictexpire");
- mp->options = tmp;
- }
- }
-
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(mp->options, strlen(mp->options) + 7);
- if (tmp) {
- strcat(tmp, ",ignore");
- mp->options = tmp;
- }
- }
}
/* In case the directory doesn't exist, try to mkdir it */
@@ -676,29 +657,10 @@ int mount_autofs_offset(struct autofs_po
}
if (!mp->options) {
- mp->options = make_options_string(ap->path, ap->kpipefd, str_offset);
+ mp->options = make_options_string(ap->path,
+ ap->kpipefd, str_offset, ap->flags);
if (!mp->options)
return MOUNT_OFFSET_OK;
-
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(mp->options, strlen(mp->options) + 12);
- if (tmp) {
- strcat(tmp, ",strictexpire");
- mp->options = tmp;
- }
- }
-
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(mp->options, strlen(mp->options) + 7);
- if (tmp) {
- strcat(tmp, ",ignore");
- mp->options = tmp;
- }
- }
}
strcpy(mountpoint, root);
--- autofs-5.1.4.orig/daemon/indirect.c
+++ autofs-5.1.4/daemon/indirect.c
@@ -78,32 +78,13 @@ static int do_mount_autofs_indirect(stru
}
}
- options = make_options_string(ap->path, ap->kpipefd, str_indirect);
+ options = make_options_string(ap->path,
+ ap->kpipefd, str_indirect, ap->flags);
if (!options) {
error(ap->logopt, "options string error");
goto out_err;
}
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(options, strlen(options) + 12);
- if (tmp) {
- strcat(tmp, ",strictexpire");
- options = tmp;
- }
- }
-
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
- (get_kver_major() > 5))) {
- char *tmp = realloc(options, strlen(options) + 7);
- if (tmp) {
- strcat(tmp, ",ignore");
- options = tmp;
- }
- }
-
/* In case the directory doesn't exist, try to mkdir it */
if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
--- autofs-5.1.4.orig/include/mounts.h
+++ autofs-5.1.4/include/mounts.h
@@ -94,7 +94,8 @@ void free_amd_entry_list(struct list_hea
unsigned int query_kproto_ver(void);
unsigned int get_kver_major(void);
unsigned int get_kver_minor(void);
-char *make_options_string(char *path, int kernel_pipefd, const char *extra);
+char *make_options_string(char *path, int pipefd,
+ const char *type, unsigned int flags);
char *make_mnt_name_string(char *path);
int ext_mount_add(struct list_head *, const char *, unsigned int);
int ext_mount_remove(struct list_head *, const char *);
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -599,43 +599,111 @@ void free_amd_entry_list(struct list_hea
}
}
+static int cacl_max_options_len(unsigned int flags)
+{
+ unsigned int kver_major = get_kver_major();
+ unsigned int kver_minor = get_kver_minor();
+ int max_len;
+
+ /* %d and %u are maximum lenght of 10 and mount type is maximum
+ * length of 9 (e. ",indirect").
+ * The base temaplate is "fd=%d,pgrp=%u,minproto=5,maxproto=%d"
+ * plus the length of mount type plus 1 for the NULL.
+ */
+ max_len = 79 + 1;
+
+ if (kver_major < 5 || (kver_major == 5 && kver_minor < 4))
+ goto out;
+
+ /* maybe add ",strictexpire" */
+ if (flags & MOUNT_FLAG_STRICTEXPIRE)
+ max_len += 13;
+
+ if (kver_major == 5 && kver_minor < 5)
+ goto out;
+
+ /* maybe add ",ignore" */
+ if (flags & MOUNT_FLAG_IGNORE)
+ max_len += 7;
+out:
+ return max_len;
+}
+
/*
* Make common autofs mount options string
*/
-char *make_options_string(char *path, int pipefd, const char *extra)
+char *make_options_string(char *path, int pipefd,
+ const char *type, unsigned int flags)
{
+ unsigned int kver_major = get_kver_major();
+ unsigned int kver_minor = get_kver_minor();
char *options;
- int len;
+ int max_len, len, new;
- options = malloc(MAX_OPTIONS_LEN + 1);
+ max_len = cacl_max_options_len(flags);
+
+ options = malloc(max_len);
if (!options) {
logerr("can't malloc options string");
return NULL;
}
- if (extra)
- len = snprintf(options, MAX_OPTIONS_LEN,
+ if (type)
+ len = snprintf(options, max_len,
options_template_extra,
pipefd, (unsigned) getpgrp(),
- AUTOFS_MAX_PROTO_VERSION, extra);
+ AUTOFS_MAX_PROTO_VERSION, type);
else
- len = snprintf(options, MAX_OPTIONS_LEN, options_template,
+ len = snprintf(options, max_len, options_template,
pipefd, (unsigned) getpgrp(),
AUTOFS_MAX_PROTO_VERSION);
- if (len >= MAX_OPTIONS_LEN) {
- logerr("buffer to small for options - truncated");
- len = MAX_OPTIONS_LEN - 1;
+ if (len < 0)
+ goto error_out;
+
+ if (len >= max_len)
+ goto truncated;
+
+ if (kver_major < 5 || (kver_major == 5 && kver_minor < 4))
+ goto out;
+
+ /* maybe add ",strictexpire" */
+ if (flags & MOUNT_FLAG_STRICTEXPIRE) {
+ new = snprintf(options + len,
+ max_len, "%s", ",strictexpire");
+ if (new < 0)
+ goto error_out;
+ len += new;
+ if (len >= max_len)
+ goto truncated;
}
- if (len < 0) {
- logerr("failed to malloc autofs mount options for %s", path);
- free(options);
- return NULL;
+ if (kver_major == 5 && kver_minor < 5)
+ goto out;
+
+ /* maybe add ",ignore" */
+ if (flags & MOUNT_FLAG_IGNORE) {
+ new = snprintf(options + len,
+ max_len, "%s", ",ignore");
+ if (new < 0)
+ goto error_out;
+ len += new;
+ if (len >= max_len)
+ goto truncated;
}
+out:
options[len] = '\0';
-
return options;
+
+truncated:
+ logerr("buffer to small for options - truncated");
+ len = max_len -1;
+ goto out;
+
+error_out:
+ logerr("error constructing mount options string for %s", path);
+ free(options);
+ return NULL;
}
char *make_mnt_name_string(char *path)

View File

@ -0,0 +1,52 @@
autofs-5.1.6 - fix browse dir not re-created on symlink expire
From: Ian Kent <raven@themaw.net>
If symlinks are being used for mounts and the autofs mount has browse mode
enabled when a symlink is removed at expire the browse mode directory needs
to be re-created.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -115,6 +115,7 @@ xx/xx/2018 autofs-5.1.5
- remove unused function dump_master().
- fix additional typing errors.
- make bind mounts propagation slave by default.
+- fix browse dir not re-created on symlink expire.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/automount.c
+++ autofs-5.1.4/daemon/automount.c
@@ -651,6 +651,25 @@ int umount_multi(struct autofs_point *ap
"failed to remove symlink %s", path);
return 1;
}
+ /* Check if the autofs mount has browse mode enabled.
+ * If so re-create the directory entry.
+ */
+ if (ap->flags | MOUNT_FLAG_GHOST) {
+ int ret;
+
+ /* If the browse directory create fails log an
+ * error and continue anyway since the expire
+ * has succeeded.
+ */
+ ret = mkdir_path(path, mp_mode);
+ if (ret && errno != EEXIST) {
+ char buf[MAX_ERR_BUF];
+ char *estr;
+ estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ warn(ap->logopt,
+ "mkdir_path %s failed: %s", path, estr);
+ }
+ }
/* Check for an external mount and attempt umount if needed */
mounts_mutex_lock(ap);
entry = __master_find_amdmount(ap, path);

View File

@ -0,0 +1,40 @@
autofs-5.1.6 - fix direct mount unlink_mount_tree() path
From: Ian Kent <raven@themaw.net>
Oops!
The path used if unlink_mount_tree() is called for direct mount entries
is not correct, fix it.
Note: the mount table handling has changed and using the --force option
with automount when direct mount maps are large will result in somewhat
larger overhead.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -83,6 +83,7 @@ xx/xx/2018 autofs-5.1.5
- fix autofs mount options construction.
- mount_nfs.c fix local rdma share not mounting.
- fix incorrect systemctl command syntax in autofs(8).
+- fix direct mount unlink_mount_tree() path.
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/daemon/direct.c
+++ autofs-5.1.4/daemon/direct.c
@@ -311,7 +311,7 @@ int do_mount_autofs_direct(struct autofs
return 0;
}
- ret = unlink_mount_tree(ap, ap->path);
+ ret = unlink_mount_tree(ap, me->key);
if (!ret) {
error(ap->logopt,
"already mounted as other than autofs "

View File

@ -0,0 +1,36 @@
autofs-5.1.6 - fix double quoting in auto.smb
From: Ian Kent <raven@themaw.net>
The example program mount script installed to /etc/auto.smb incorrectly
adds a quote for the trailing dollar of special Windows mounts. But they
are already surrounded by double quotes. This may have been handled by
mount.cifs at some point but it's failing now.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/auto.smb | 2 --
2 files changed, 1 insertion(+), 2 deletions(-)
--- autofs-5.1.4.orig/samples/auto.smb
+++ autofs-5.1.4/samples/auto.smb
@@ -75,8 +75,6 @@ $SMBCLIENT $smbopts -gL "$key" 2>/dev/nu
dir = $2
loc = $2
# Enclose mount dir and location in quotes
- # Double quote "$" in location as it is special
- gsub(/\$$/, "\\$", loc);
gsub(/\&/,"\\\\&",loc)
print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
}
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -81,6 +81,7 @@
- fix kernel mount status notification.
- fix set open file limit.
- improve descriptor open error reporting.
+- fix double quoting in auto.smb.
xx/xx/2018 autofs-5.1.5
- fix flag file permission.

View File

@ -0,0 +1,35 @@
autofs-5.1.6 - fix double quoting of ampersand in auto.smb as well
From: Ian Kent <raven@themaw.net>
The example program mount script installed to /etc/auto.smb incorrectly
adds a quote for the & character that causes mount failures. But the
produced map entry is already surrounded by double quotes. This may have
been handled by mount.cifs at some point but it's failing now.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/auto.smb | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
--- autofs-5.1.4.orig/samples/auto.smb
+++ autofs-5.1.4/samples/auto.smb
@@ -75,7 +75,6 @@ $SMBCLIENT $smbopts -gL "$key" 2>/dev/nu
dir = $2
loc = $2
# Enclose mount dir and location in quotes
- gsub(/\&/,"\\\\&",loc)
print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
}
END { if (!first) print "\n"; else exit 1 }
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -82,6 +82,7 @@
- fix set open file limit.
- improve descriptor open error reporting.
- fix double quoting in auto.smb.
+- fix double quoting of ampersand in auto.smb as well.
xx/xx/2018 autofs-5.1.5
- fix flag file permission.

View File

@ -0,0 +1,47 @@
autofs-5.1.6 - fix empty mounts list return from unlink_mount_tree()
From: Ian Kent <raven@themaw.net>
If there are no appropriate mounts found by get_mnt_list() then
unlink_mount_tree() should return 1 not 0 since if there are no
mounts to umount this shouldn't cause a failure return.
Also, if a real error occurs in get_mnt_list() we should check for
it and return a failure from unlink_mount_tree() since that would
be mount table not found or out of memory. If that's ignored things
would only get worse from that point.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 8 ++++++--
2 files changed, 7 insertions(+), 2 deletions(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -75,6 +75,7 @@
- fix direct mount deadlock.
- fix lookup_prune_one_cache() refactoring change.
- add missing description of null map option.
+- fix empty mounts list return from unlink_mount_tree().
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
@@ -2115,9 +2115,13 @@ int unlink_mount_tree(struct autofs_poin
struct mnt_list *mnts, *mnt;
int rv, ret = 1;
+ errno = 0;
mnts = get_mnt_list(mp, 1);
- if (!mnts)
- return 0;
+ if (!mnts) {
+ if (errno)
+ return 0;
+ return 1;
+ }
for (mnt = mnts; mnt; mnt = mnt->next) {
if (mnt->flags & MNTS_AUTOFS)

View File

@ -0,0 +1,33 @@
autofs-5.1.6 - fix incorrect logical compare in unlink_mount_tree()
From: Ian Kent <raven@themaw.net>
Fix silly mistake using or instead of and in unlink_mount_tree().
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
--- autofs-5.1.4.orig/CHANGELOG
+++ autofs-5.1.4/CHANGELOG
@@ -85,6 +85,7 @@ xx/xx/2018 autofs-5.1.5
- fix incorrect systemctl command syntax in autofs(8).
- fix direct mount unlink_mount_tree() path.
- fix unlink mounts umount order.
+- fix incorrect logical compare in unlink_mount_tree().
19/12/2017 autofs-5.1.4
- fix spec file url.
--- autofs-5.1.4.orig/lib/mounts.c
+++ autofs-5.1.4/lib/mounts.c
@@ -959,7 +959,7 @@ int unlink_mount_tree(struct autofs_poin
return 0;
for (mnt = mnts; mnt; mnt = mnt->next) {
- if (mnt->flags | MNTS_AUTOFS)
+ if (mnt->flags & MNTS_AUTOFS)
rv = umount2(mnt->mp, MNT_DETACH);
else
rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);

Some files were not shown because too many files have changed in this diff Show More