Browse Source

- autofs: bump version to 5.1.6

master
vanhofen 5 years ago
parent
commit
53a7aa9be8
  1. 7
      make/target-tools.mk
  2. 47
      patches/autofs/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch
  3. 43
      patches/autofs/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch
  4. 87
      patches/autofs/autofs-5.1.5-add-ignore-mount-option.patch
  5. 188
      patches/autofs/autofs-5.1.5-add-mount_verbose-configuration-option.patch
  6. 215
      patches/autofs/autofs-5.1.5-add-strictexpire-mount-option.patch
  7. 52
      patches/autofs/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch
  8. 234
      patches/autofs/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch
  9. 171
      patches/autofs/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch
  10. 165
      patches/autofs/autofs-5.1.5-use-malloc-in-spawn_c.patch
  11. 9
      patches/autofs/patch_order_5.1.5

7
make/target-tools.mk

@ -891,7 +891,7 @@ ntfs-3g: $(ARCHIVE)/$(NTFS-3G_SOURCE) | $(TARGET_DIR)
# -----------------------------------------------------------------------------
AUTOFS_VER = 5.1.5
AUTOFS_VER = 5.1.6
AUTOFS_TMP = autofs-$(AUTOFS_VER)
AUTOFS_SOURCE = autofs-$(AUTOFS_VER).tar.xz
AUTOFS_URL = https://www.kernel.org/pub/linux/daemons/autofs/v5
@ -903,8 +903,8 @@ $(ARCHIVE)/$(AUTOFS_SOURCE):
# wget -N https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.6/patch_order_5.1.5
# for p in $(cat patch_order_5.1.5); do test -f $p || wget https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.6/$p; done
AUTOFS_PATCH = $(shell cat $(PATCHES)/autofs/patch_order_$(AUTOFS_VER))
AUTOFS_PATCH += force-STRIP-to-emtpy.patch
AUTOFS_PATCH = force-STRIP-to-emtpy.patch
#AUTOFS_PATCH += $(shell cat $(PATCHES)/autofs/patch_order_$(AUTOFS_VER))
AUTOFS_DEPS = libtirpc
@ -926,7 +926,6 @@ autofs: $(AUTOFS_DEPS) $(ARCHIVE)/$(AUTOFS_SOURCE) | $(TARGET_DIR)
--disable-mount-locking \
--without-openldap \
--without-sasl \
--enable-ignore-busy \
--with-path=$(PATH) \
--with-libtirpc \
--with-hesiod=no \

47
patches/autofs/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch

@ -1,47 +0,0 @@
autofs-5.1.5 - Fix NFS mount from IPv6 addresses
From: Goldwyn Rodrigues <rgoldwyn@suse.de>
When an NFS server is specified by an IPv6 address and no mount
options, the mount fails because check_address_proto()
receives vers with TCP_REQUESTED set but the host.addr_len is
INET6_ADDRSTRLEN. Removing the check for INET_ADDRSTRLEN
fixes this issue.
However, this will allow mount from "proto=tcp" for an IPv6
addressed server.
Fixes: 9053214 ("autofs-5.1.3 - fix ipv6 proto option handling")
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Acked-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/replicated.c | 3 ---
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 5650e73b..c8a3dec2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@ xx/xx/2019 autofs-5.1.6
- add mount_verbose configuration option.
- optionally log mount requestor process info.
- log mount call arguments if mount_verbose is set.
+- Fix NFS mount from IPv6 addresses.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/modules/replicated.c b/modules/replicated.c
index 740270ec..e99e32a9 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -497,9 +497,6 @@ static int check_address_proto(unsigned logopt,
if (ipv6_requested) {
if (host->addr_len == INET_ADDRSTRLEN)
ret = 0;
- } else {
- if (host->addr_len == INET6_ADDRSTRLEN)
- ret = 0;
}
if (!ret)

43
patches/autofs/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch

@ -1,43 +0,0 @@
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(+)
diff --git a/CHANGELOG b/CHANGELOG
index 76da2ee4..e71e913a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
xx/xx/2019 autofs-5.1.6
- support strictexpire mount option.
- fix hesiod string check in master_parse().
+- add NULL check for get_addr_string() return.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index 426c27bd..295c4a5d 100644
--- a/modules/mount_nfs.c
+++ b/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);

87
patches/autofs/autofs-5.1.5-add-ignore-mount-option.patch

@ -1,87 +0,0 @@
autofs-5.1.5 - add ignore mount option
From: Ian Kent <raven@themaw.net>
Add mount option "ignore", if the kernel supports it, as an
indicator to applications to ignore the mount entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
daemon/direct.c | 10 ++++++++++
daemon/indirect.c | 10 ++++++++++
include/automount.h | 3 +++
lib/master.c | 4 ++--
4 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/daemon/direct.c b/daemon/direct.c
index 4f468563..42992220 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -431,6 +431,16 @@ int do_mount_autofs_direct(struct autofs_point *ap,
mp->options = tmp;
}
}
+
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
+ if (tmp) {
+ strcat(tmp, ",ignore");
+ mp->options = tmp;
+ }
+ }
}
/* In case the directory doesn't exist, try to mkdir it */
diff --git a/daemon/indirect.c b/daemon/indirect.c
index 9ccbc038..8719960e 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -142,6 +142,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
}
}
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
+ (get_kver_major() > 5))) {
+ char *tmp = realloc(options, strlen(options) + 7);
+ if (tmp) {
+ strcat(tmp, ",ignore");
+ options = tmp;
+ }
+ }
+
/* In case the directory doesn't exist, try to mkdir it */
if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
diff --git a/include/automount.h b/include/automount.h
index 1bb32015..d02410f3 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -557,6 +557,9 @@ struct kernel_mod_version {
/* Use strict expire semantics if requested and kernel supports it */
#define MOUNT_FLAG_STRICTEXPIRE 0x0400
+/* Indicator for applications to ignore the mount entry */
+#define MOUNT_FLAG_IGNORE 0x0800
+
struct autofs_point {
pthread_t thid;
char *path; /* Mount point name */
diff --git a/lib/master.c b/lib/master.c
index 5f3a3d99..e0bd34ab 100644
--- a/lib/master.c
+++ b/lib/master.c
@@ -101,9 +101,9 @@ int master_add_autofs_point(struct master_mapent *entry, unsigned logopt,
ap->negative_timeout = global_negative_timeout;
ap->exp_timeout = defaults_get_timeout();
ap->exp_runfreq = 0;
- ap->flags = 0;
+ ap->flags = MOUNT_FLAG_IGNORE;
if (ghost)
- ap->flags = MOUNT_FLAG_GHOST;
+ ap->flags |= MOUNT_FLAG_GHOST;
if (nobind)
ap->flags |= MOUNT_FLAG_NOBIND;

188
patches/autofs/autofs-5.1.5-add-mount_verbose-configuration-option.patch

@ -1,188 +0,0 @@
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(-)
diff --git a/CHANGELOG b/CHANGELOG
index b3c3b3b9..c2a0c7f1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@ xx/xx/2019 autofs-5.1.6
- fix hesiod string check in master_parse().
- add NULL check for get_addr_string() return.
- use malloc(3) in spawn.c.
+- add mount_verbose configuration option.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/daemon/spawn.c b/daemon/spawn.c
index 2ab5c46f..4eb268ab 100644
--- a/daemon/spawn.c
+++ b/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 *);
diff --git a/include/defaults.h b/include/defaults.h
index b28fde34..baa4b4c9 100644
--- a/include/defaults.h
+++ b/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(void);
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);
diff --git a/lib/defaults.c b/lib/defaults.c
index ae4d27c1..4ac5a180 100644
--- a/lib/defaults.c
+++ b/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(void)
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)
@@ -1781,6 +1787,17 @@ unsigned int defaults_get_append_options(void)
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)
{
long wait;
diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in
index cd7fc2f2..31136e2e 100644
--- a/man/autofs.conf.5.in
+++ b/man/autofs.conf.5.in
@@ -41,6 +41,10 @@ Set the default timeout for caching failed key lookups (program default
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)
diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in
index a72a79f6..7949f51a 100644
--- a/redhat/autofs.conf.default.in
+++ b/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
diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in
index 2693a975..d33625f1 100644
--- a/samples/autofs.conf.default.in
+++ b/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

215
patches/autofs/autofs-5.1.5-add-strictexpire-mount-option.patch

@ -1,215 +0,0 @@
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 | 3 +++
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, 47 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index ca036f19..f671dc52 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+xx/xx/2019 autofs-5.1.6
+- support strictexpire mount option.
+
30/10/2018 autofs-5.1.5
- fix flag file permission.
- fix directory create permission.
diff --git a/daemon/direct.c b/daemon/direct.c
index b885d12f..9c61c4b4 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -421,6 +421,16 @@ int do_mount_autofs_direct(struct autofs_point *ap,
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 */
diff --git a/daemon/indirect.c b/daemon/indirect.c
index 438a0a21..d0724293 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -132,6 +132,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
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) {
diff --git a/include/automount.h b/include/automount.h
index 947daa10..1bb32015 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -554,6 +554,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 */
diff --git a/lib/master_parse.y b/lib/master_parse.y
index 9aa57327..8fe8b128 100644
--- a/lib/master_parse.y
+++ b/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 *buffer, unsigned int default_timeout, unsigne
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)
diff --git a/lib/master_tok.l b/lib/master_tok.l
index f4e940ce..7486710b 100644
--- a/lib/master_tok.l
+++ b/lib/master_tok.l
@@ -391,6 +391,7 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS})
-?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); }
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
index 68242d45..dace4a1c 100644
--- a/man/auto.master.5.in
+++ b/man/auto.master.5.in
@@ -199,6 +199,14 @@ entries only, either in the master map (so it effects all map entries)
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
diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c
index cd0631b8..72e1aba4 100644
--- a/modules/mount_autofs.c
+++ b/modules/mount_autofs.c
@@ -57,6 +57,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
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, const char *root, const char *name,
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, const char *root, const char *name,
nap->parent = ap;
if (symlnk)
nap->flags |= MOUNT_FLAG_SYMLINK;
+ if (strictexpire)
+ nap->flags |= MOUNT_FLAG_STRICTEXPIRE;
if (hosts)
argc = 0;

52
patches/autofs/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch

@ -1,52 +0,0 @@
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(-)
diff --git a/CHANGELOG b/CHANGELOG
index f671dc52..76da2ee4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
xx/xx/2019 autofs-5.1.6
- support strictexpire mount option.
+- fix hesiod string check in master_parse().
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/lib/master_parse.y b/lib/master_parse.y
index 8fe8b128..f817f739 100644
--- a/lib/master_parse.y
+++ b/lib/master_parse.y
@@ -173,8 +173,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;
@@ -362,8 +362,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;

234
patches/autofs/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch

@ -1,234 +0,0 @@
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(-)
diff --git a/CHANGELOG b/CHANGELOG
index ee7deda4..5650e73b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ xx/xx/2019 autofs-5.1.6
- 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.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/modules/mount_afs.c b/modules/mount_afs.c
index 2a776bd2..ef4e04da 100644
--- a/modules/mount_afs.c
+++ b/modules/mount_afs.c
@@ -37,10 +37,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
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, const char *root, const char *name, int
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. */
}
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
index b64cdccc..9cba0d7a 100644
--- a/modules/mount_bind.c
+++ b/modules/mount_bind.c
@@ -81,10 +81,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
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, const char *root, const char *name, int
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);
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
index 3bbea95a..eb28b06c 100644
--- a/modules/mount_ext2.c
+++ b/modules/mount_ext2.c
@@ -47,10 +47,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
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, const char *root, const char *name, int
}
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);
}
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
index b1a3adbf..cf531145 100644
--- a/modules/mount_generic.c
+++ b/modules/mount_generic.c
@@ -46,10 +46,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
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, const char *root, const char *name, int
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);
}
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index 295c4a5d..4e3e703f 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -77,13 +77,17 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
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, const char *root, const char *name, int
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);
}

171
patches/autofs/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch

@ -1,171 +0,0 @@
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(-)
diff --git a/CHANGELOG b/CHANGELOG
index c2a0c7f1..ee7deda4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ xx/xx/2019 autofs-5.1.6
- 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.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/daemon/direct.c b/daemon/direct.c
index 9c61c4b4..4f468563 100644
--- a/daemon/direct.c
+++ b/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,
diff --git a/daemon/indirect.c b/daemon/indirect.c
index d0724293..9ccbc038 100644
--- a/daemon/indirect.c
+++ b/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");
diff --git a/include/log.h b/include/log.h
index c9b17b3c..69eed96b 100644
--- a/include/log.h
+++ b/include/log.h
@@ -46,6 +46,8 @@ extern void log_crit(unsigned, const char* msg, ...);
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)
diff --git a/lib/log.c b/lib/log.c
index ca771d72..0cb47d7e 100644
--- a/lib/log.c
+++ b/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;
+}
diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in
index 31136e2e..95ff7dd0 100644
--- a/man/autofs.conf.5.in
+++ b/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
diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in
index 7949f51a..4b89a5f7 100644
--- a/redhat/autofs.conf.default.in
+++ b/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
#
diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in
index d33625f1..2f155111 100644
--- a/samples/autofs.conf.default.in
+++ b/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
#

165
patches/autofs/autofs-5.1.5-use-malloc-in-spawn_c.patch

@ -1,165 +0,0 @@
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(-)
diff --git a/CHANGELOG b/CHANGELOG
index e71e913a..b3c3b3b9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ xx/xx/2019 autofs-5.1.6
- support strictexpire mount option.
- fix hesiod string check in master_parse().
- add NULL check for get_addr_string() return.
+- use malloc(3) in spawn.c.
30/10/2018 autofs-5.1.5
- fix flag file permission.
diff --git a/daemon/spawn.c b/daemon/spawn.c
index dbbca7fa..2ab5c46f 100644
--- a/daemon/spawn.c
+++ b/daemon/spawn.c
@@ -521,22 +521,33 @@ int spawnv(unsigned logopt, const char *prog, const char *const *argv)
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;
}

9
patches/autofs/patch_order_5.1.5

@ -1,9 +0,0 @@
autofs-5.1.5-add-strictexpire-mount-option.patch
autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch
autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch
autofs-5.1.5-use-malloc-in-spawn_c.patch
autofs-5.1.5-add-mount_verbose-configuration-option.patch
autofs-5.1.5-optionally-log-mount-requestor-process-info.patch
autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch
autofs-5.1.5-add-ignore-mount-option.patch
autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch
Loading…
Cancel
Save