import autofs-5.1.4-35.el8

This commit is contained in:
CentOS Sources 2019-08-01 13:02:07 -04:00 committed by Stepan Oksanichenko
commit 5b988a9557
57 changed files with 10854 additions and 0 deletions

1
.autofs.metadata Normal file
View File

@ -0,0 +1 @@
0256f9e75e2da9185afe797f1c5bedb1604c7eb2 SOURCES/autofs-5.1.4.tar.gz

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
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,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,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,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,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,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,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,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,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,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;
}

2303
SPECS/autofs.spec Normal file

File diff suppressed because it is too large Load Diff