11 changed files with 3 additions and 1215 deletions
			
			
		| @ -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) |  | ||||
| @ -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); |  | ||||
| @ -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; |  | ||||
| @ -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 |  | ||||
| @ -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; |  | ||||
| @ -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; |  | ||||
| @ -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); |  | ||||
|  		} |  | ||||
| @ -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 |  | ||||
|  # |  | ||||
| @ -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; |  | ||||
|  } |  | ||||
| @ -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…
					
					
				
		Reference in new issue