Blob Blame History Raw
autofs-5.0.8 - use open(2) instead of access(2)

From: Ian Kent <ikent@redhat.com>

The access(2) system call has been used to trigger dependednt automounts
in the target path when mounting. But access(2) no longer triggers the
dependednt mounts.

So use open(2) with flag O_DIRECTORY which will trigger these mounts.
---
 CHANGELOG      |    1 +
 daemon/spawn.c |   30 ++++++++++++++++++------------
 2 files changed, 19 insertions(+), 12 deletions(-)

--- autofs-5.0.7.orig/CHANGELOG
+++ autofs-5.0.7/CHANGELOG
@@ -104,6 +104,7 @@
 - fix variable substitution description.
 - fix incorrect append options description in README.v5-release.
 - fix mistake in assignment.
+- use open(2) instead of access(2) to trigger dependent mounts.
 
 25/07/2012 autofs-5.0.7
 =======================
--- autofs-5.0.7.orig/daemon/spawn.c
+++ autofs-5.0.7/daemon/spawn.c
@@ -32,7 +32,7 @@ static pthread_mutex_t spawn_mutex = PTH
 
 #define SPAWN_OPT_NONE		0x0000
 #define SPAWN_OPT_LOCK		0x0001
-#define SPAWN_OPT_ACCESS	0x0002
+#define SPAWN_OPT_OPEN		0x0002
 
 #define MTAB_LOCK_RETRIES	3
 
@@ -126,7 +126,7 @@ static int do_spawn(unsigned logopt, uns
 	int errp, errn;
 	int cancel_state;
 	unsigned int use_lock = options & SPAWN_OPT_LOCK;
-	unsigned int use_access = options & SPAWN_OPT_ACCESS;
+	unsigned int use_open = options & SPAWN_OPT_OPEN;
 	sigset_t allsigs, tmpsig, oldsig;
 	struct thread_stdenv_vars *tsv;
 	pid_t euid = 0;
@@ -166,6 +166,8 @@ static int do_spawn(unsigned logopt, uns
 		/* what to mount must always be second last */
 		while (*pargv++)
 			loc++;
+		if (loc <= 3)
+			goto done;
 		loc -= 2;
 
 		/*
@@ -176,7 +178,9 @@ static int do_spawn(unsigned logopt, uns
 		 *
 		 * I hope host names are never allowed "/" as first char
 		 */
-		if (use_access && *(argv[loc]) == '/') {
+		if (use_open && *(argv[loc]) == '/') {
+			int fd;
+
 			pid_t pgrp = getpgrp();
 
 			/*
@@ -192,19 +196,21 @@ static int do_spawn(unsigned logopt, uns
 			/*
 			 * Trigger the recursive mount.
 			 *
-			 * Ignore the access(2) return code as there may be
+			 * Ignore the open(2) return code as there may be
 			 * multiple waiters for this mount and we need to
-			 * let the  VFS handle access returns to each
-			 * individual waiter.
+			 * let the VFS handle returns to each individual
+			 * waiter.
 			 */
-			access(argv[loc], F_OK);
+			fd = open(argv[loc], O_DIRECTORY);
+			if (fd != -1)
+				close(fd);
 
 			seteuid(0);
 			setegid(0);
 			if (pgrp >= 0)
 				setpgid(0, pgrp);
 		}
-
+done:
 		execv(prog, (char *const *) argv);
 		_exit(255);	/* execv() failed */
 	} else {
@@ -327,7 +333,7 @@ int spawn_mount(unsigned logopt, ...)
 #ifdef ENABLE_MOUNT_LOCKING
 	options = SPAWN_OPT_LOCK;
 #else
-	options = SPAWN_OPT_ACCESS;
+	options = SPAWN_OPT_OPEN;
 #endif
 
 	va_start(arg, logopt);
@@ -360,7 +366,7 @@ int spawn_mount(unsigned logopt, ...)
 		p = argv + 2;
 	}
 	while ((*p = va_arg(arg, char *))) {
-		if (options == SPAWN_OPT_ACCESS && !strcmp(*p, "-t")) {
+		if (options == SPAWN_OPT_OPEN && !strcmp(*p, "-t")) {
 			*(++p) = va_arg(arg, char *);
 			if (!*p)
 				break;
@@ -429,7 +435,7 @@ int spawn_mount(unsigned logopt, ...)
 
 /*
  * For bind mounts that depend on the target being mounted (possibly
- * itself an automount) we attempt to mount the target using an access
+ * itself an automount) we attempt to mount the target using an open(2)
  * call. For this to work the location must be the second last arg.
  *
  * NOTE: If mount locking is enabled this type of recursive mount cannot
@@ -455,7 +461,7 @@ int spawn_bind_mount(unsigned logopt, ..
 #ifdef ENABLE_MOUNT_LOCKING
 	options = SPAWN_OPT_LOCK;
 #else
-	options = SPAWN_OPT_ACCESS;
+	options = SPAWN_OPT_OPEN;
 #endif
 
 	/*