autofs-5.0.8 - use open(2) instead of access(2) From: Ian Kent 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(-) diff --git a/CHANGELOG b/CHANGELOG index f58efa9..ffcb39d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -37,6 +37,7 @@ - fix inconsistent error returns in handle_packet_missing_direct(). - simple coverity fixes. - fix fix options compare. +- use open(2) instead of access(2) to trigger dependent mounts. 17/10/2013 autofs-5.0.8 ======================= diff --git a/daemon/spawn.c b/daemon/spawn.c index abb353a..a6c8c34 100644 --- a/daemon/spawn.c +++ b/daemon/spawn.c @@ -32,7 +32,7 @@ static pthread_mutex_t spawn_mutex = PTHREAD_MUTEX_INITIALIZER; #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, unsigned int wait, 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, unsigned int wait, /* 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, unsigned int wait, * * 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, unsigned int wait, /* * 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 /*