Ian Kent 62ad96
autofs-5.0.3 - check for mtab pointing to /proc/mounts
Ian Kent 62ad96
Ian Kent 62ad96
From: Ian Kent <raven@themaw.net>
Ian Kent 62ad96
Ian Kent 62ad96
autofs has problems if /etc/mtab points to /proc/mounts.
Ian Kent 62ad96
This patchs adds a check to see if this is the case. If it is then
Ian Kent 62ad96
autofs uses the mount(8) "-n" option which disables the normal mtab
Ian Kent 62ad96
update error checking.
Ian Kent 62ad96
---
Ian Kent 62ad96
Ian Kent 62ad96
 CHANGELOG      |    1 
Ian Kent 62ad96
 daemon/spawn.c |   66 +++++++++++++++++++++++++++++++++++++++++++++++++++------
Ian Kent 62ad96
 2 files changed, 61 insertions(+), 6 deletions(-)
Ian Kent 62ad96
Ian Kent 62ad96
Ian Kent 62ad96
--- autofs-5.0.3.orig/CHANGELOG
Ian Kent 62ad96
+++ autofs-5.0.3/CHANGELOG
Ian Kent 62ad96
@@ -31,6 +31,7 @@
Ian Kent 62ad96
 - add replicated server selection debug logging.
Ian Kent 62ad96
 - update replicated server selection documentation.
Ian Kent 62ad96
 - use /dev/urandom instead of /dev/random.
Ian Kent 62ad96
+- check for mtab pointing to /proc/mounts.
Ian Kent 62ad96
  
Ian Kent 62ad96
 14/01/2008 autofs-5.0.3
Ian Kent 62ad96
 -----------------------
Ian Kent 62ad96
--- autofs-5.0.3.orig/daemon/spawn.c
Ian Kent 62ad96
+++ autofs-5.0.3/daemon/spawn.c
Ian Kent 62ad96
@@ -305,11 +305,13 @@ int spawn_mount(unsigned logopt, ...)
Ian Kent 62ad96
 	char **argv, **p;
Ian Kent 62ad96
 	char prog[] = PATH_MOUNT;
Ian Kent 62ad96
 	char arg0[] = PATH_MOUNT;
Ian Kent 62ad96
+	char argn[] = "-n";
Ian Kent 62ad96
 	/* In case we need to use the fake option to mount */
Ian Kent 62ad96
 	char arg_fake[] = "-f";
Ian Kent 62ad96
 	unsigned int options;
Ian Kent 62ad96
 	unsigned int retries = MTAB_LOCK_RETRIES;
Ian Kent 62ad96
-	int ret, printed = 0;
Ian Kent 62ad96
+	int update_mtab = 1, ret, printed = 0;
Ian Kent 62ad96
+	char buf[PATH_MAX];
Ian Kent 62ad96
 
Ian Kent 62ad96
 	/* If we use mount locking we can't validate the location */
Ian Kent 62ad96
 #ifdef ENABLE_MOUNT_LOCKING
Ian Kent 62ad96
@@ -322,6 +324,17 @@ int spawn_mount(unsigned logopt, ...)
Ian Kent 62ad96
 	for (argc = 1; va_arg(arg, char *); argc++);
Ian Kent 62ad96
 	va_end(arg);
Ian Kent 62ad96
 
Ian Kent 62ad96
+	ret = readlink(_PATH_MOUNTED, buf, PATH_MAX);
Ian Kent 62ad96
+	if (ret != -1) {
Ian Kent 62ad96
+		buf[ret] = '\0';
Ian Kent 62ad96
+		if (!strcmp(buf, _PROC_MOUNTS)) {
Ian Kent 62ad96
+			debug(logopt,
Ian Kent 62ad96
+			      "mtab link detected, passing -n to mount");
Ian Kent 62ad96
+			argc++;
Ian Kent 62ad96
+			update_mtab = 0;
Ian Kent 62ad96
+		}
Ian Kent 62ad96
+	}
Ian Kent 62ad96
+
Ian Kent 62ad96
 	/* Alloc 1 extra slot in case we need to use the "-f" option */
Ian Kent 62ad96
 	if (!(argv = alloca(sizeof(char *) * argc + 2)))
Ian Kent 62ad96
 		return -1;
Ian Kent 62ad96
@@ -329,7 +342,12 @@ int spawn_mount(unsigned logopt, ...)
Ian Kent 62ad96
 	argv[0] = arg0;
Ian Kent 62ad96
 
Ian Kent 62ad96
 	va_start(arg, logopt);
Ian Kent 62ad96
-	p = argv + 1;
Ian Kent 62ad96
+	if (update_mtab)
Ian Kent 62ad96
+		p = argv + 1;
Ian Kent 62ad96
+	else {
Ian Kent 62ad96
+		argv[1] = argn;
Ian Kent 62ad96
+		p = argv + 2;
Ian Kent 62ad96
+	}
Ian Kent 62ad96
 	while ((*p = va_arg(arg, char *))) {
Ian Kent 62ad96
 		if (options == SPAWN_OPT_NONE && !strcmp(*p, "-o")) {
Ian Kent 62ad96
 			*(++p) = va_arg(arg, char *);
Ian Kent 62ad96
@@ -409,11 +427,13 @@ int spawn_bind_mount(unsigned logopt, ..
Ian Kent 62ad96
 	char prog[] = PATH_MOUNT;
Ian Kent 62ad96
 	char arg0[] = PATH_MOUNT;
Ian Kent 62ad96
 	char bind[] = "--bind";
Ian Kent 62ad96
+	char argn[] = "-n";
Ian Kent 62ad96
 	/* In case we need to use the fake option to mount */
Ian Kent 62ad96
 	char arg_fake[] = "-f";
Ian Kent 62ad96
 	unsigned int options;
Ian Kent 62ad96
 	unsigned int retries = MTAB_LOCK_RETRIES;
Ian Kent 62ad96
-	int ret, printed = 0;
Ian Kent 62ad96
+	int update_mtab = 0, ret, printed = 0;
Ian Kent 62ad96
+	char buf[PATH_MAX];
Ian Kent 62ad96
 
Ian Kent 62ad96
 	/* If we use mount locking we can't validate the location */
Ian Kent 62ad96
 #ifdef ENABLE_MOUNT_LOCKING
Ian Kent 62ad96
@@ -430,6 +450,17 @@ int spawn_bind_mount(unsigned logopt, ..
Ian Kent 62ad96
 	for (argc = 2; va_arg(arg, char *); argc++);
Ian Kent 62ad96
 	va_end(arg);
Ian Kent 62ad96
 
Ian Kent 62ad96
+	ret = readlink(_PATH_MOUNTED, buf, PATH_MAX);
Ian Kent 62ad96
+	if (ret != -1) {
Ian Kent 62ad96
+		buf[ret] = '\0';
Ian Kent 62ad96
+		if (!strcmp(buf, _PROC_MOUNTS)) {
Ian Kent 62ad96
+			debug(logopt,
Ian Kent 62ad96
+			      "mtab link detected, passing -n to mount");
Ian Kent 62ad96
+			argc++;
Ian Kent 62ad96
+			update_mtab = 0;
Ian Kent 62ad96
+		}
Ian Kent 62ad96
+	}
Ian Kent 62ad96
+
Ian Kent 62ad96
 	if (!(argv = alloca(sizeof(char *) * argc + 2)))
Ian Kent 62ad96
 		return -1;
Ian Kent 62ad96
 
Ian Kent 62ad96
@@ -437,7 +468,12 @@ int spawn_bind_mount(unsigned logopt, ..
Ian Kent 62ad96
 	argv[1] = bind;
Ian Kent 62ad96
 
Ian Kent 62ad96
 	va_start(arg, logopt);
Ian Kent 62ad96
-	p = argv + 2;
Ian Kent 62ad96
+	if (update_mtab)
Ian Kent 62ad96
+		p = argv + 2;
Ian Kent 62ad96
+	else {
Ian Kent 62ad96
+		argv[2] = argn;
Ian Kent 62ad96
+		p = argv + 3;
Ian Kent 62ad96
+	}
Ian Kent 62ad96
 	while ((*p++ = va_arg(arg, char *)));
Ian Kent 62ad96
 	va_end(arg);
Ian Kent 62ad96
 
Ian Kent 62ad96
@@ -499,10 +535,12 @@ int spawn_umount(unsigned logopt, ...)
Ian Kent 62ad96
 	char **argv, **p;
Ian Kent 62ad96
 	char prog[] = PATH_UMOUNT;
Ian Kent 62ad96
 	char arg0[] = PATH_UMOUNT;
Ian Kent 62ad96
+	char argn[] = "-n";
Ian Kent 62ad96
 	unsigned int options;
Ian Kent 62ad96
 	unsigned int retries = MTAB_LOCK_RETRIES;
Ian Kent 62ad96
-	int ret, printed = 0;
Ian Kent 62ad96
+	int update_mtab = 1, ret, printed = 0;
Ian Kent 62ad96
 	unsigned int wait = defaults_get_umount_wait();
Ian Kent 62ad96
+	char buf[PATH_MAX];
Ian Kent 62ad96
 
Ian Kent 62ad96
 #ifdef ENABLE_MOUNT_LOCKING
Ian Kent 62ad96
 	options = SPAWN_OPT_LOCK;
Ian Kent 62ad96
@@ -514,13 +552,29 @@ int spawn_umount(unsigned logopt, ...)
Ian Kent 62ad96
 	for (argc = 1; va_arg(arg, char *); argc++);
Ian Kent 62ad96
 	va_end(arg);
Ian Kent 62ad96
 
Ian Kent 62ad96
+	ret = readlink(_PATH_MOUNTED, buf, PATH_MAX);
Ian Kent 62ad96
+	if (ret != -1) {
Ian Kent 62ad96
+		buf[ret] = '\0';
Ian Kent 62ad96
+		if (!strcmp(buf, _PROC_MOUNTS)) {
Ian Kent 62ad96
+			debug(logopt,
Ian Kent 62ad96
+			      "mtab link detected, passing -n to mount");
Ian Kent 62ad96
+			argc++;
Ian Kent 62ad96
+			update_mtab = 0;
Ian Kent 62ad96
+		}
Ian Kent 62ad96
+	}
Ian Kent 62ad96
+
Ian Kent 62ad96
 	if (!(argv = alloca(sizeof(char *) * argc + 1)))
Ian Kent 62ad96
 		return -1;
Ian Kent 62ad96
 
Ian Kent 62ad96
 	argv[0] = arg0;
Ian Kent 62ad96
 
Ian Kent 62ad96
 	va_start(arg, logopt);
Ian Kent 62ad96
-	p = argv + 1;
Ian Kent 62ad96
+	if (update_mtab)
Ian Kent 62ad96
+		p = argv + 1;
Ian Kent 62ad96
+	else {
Ian Kent 62ad96
+		argv[1] = argn;
Ian Kent 62ad96
+		p = argv + 2;
Ian Kent 62ad96
+	}
Ian Kent 62ad96
 	while ((*p++ = va_arg(arg, char *)));
Ian Kent 62ad96
 	va_end(arg);
Ian Kent 62ad96