Blame SOURCES/autofs-5.1.5-use-malloc-in-spawn_c.patch

306fa1
autofs-5.1.5 - use malloc(3) in spawn.c
306fa1
306fa1
From: Ian Kent <raven@themaw.net>
306fa1
306fa1
Use malloc(3) in spawn.c functions instead of alloca(3) as a failure
306fa1
return for this function is undefined.
306fa1
306fa1
Signed-off-by: Ian Kent <raven@themaw.net>
306fa1
---
306fa1
 CHANGELOG      |    1 +
306fa1
 daemon/spawn.c |   50 ++++++++++++++++++++++++++++++++++++++++++++------
306fa1
 2 files changed, 45 insertions(+), 6 deletions(-)
306fa1
306fa1
--- autofs-5.0.7.orig/CHANGELOG
306fa1
+++ autofs-5.0.7/CHANGELOG
306fa1
@@ -318,6 +318,7 @@
306fa1
 - add systemd service command line option.
306fa1
 - support strictexpire mount option.
306fa1
 - add NULL check for get_addr_string() return.
306fa1
+- use malloc(3) in spawn.c.
306fa1
 
306fa1
 25/07/2012 autofs-5.0.7
306fa1
 =======================
306fa1
--- autofs-5.0.7.orig/daemon/spawn.c
306fa1
+++ autofs-5.0.7/daemon/spawn.c
306fa1
@@ -500,22 +500,33 @@ int spawnv(unsigned logopt, const char *
306fa1
 int spawnl(unsigned logopt, const char *prog, ...)
306fa1
 {
306fa1
 	va_list arg;
306fa1
-	int argc;
306fa1
+	int argc, ret;
306fa1
 	char **argv, **p;
306fa1
+	unsigned int argv_len;
306fa1
 
306fa1
 	va_start(arg, prog);
306fa1
 	for (argc = 1; va_arg(arg, char *); argc++);
306fa1
 	va_end(arg);
306fa1
 
306fa1
-	if (!(argv = alloca(sizeof(char *) * argc)))
306fa1
+	argv_len = sizeof(char *) * (argc + 1);
306fa1
+	argv = malloc(argv_len);
306fa1
+	if (!argv) {
306fa1
+		char buf[MAX_ERR_BUF];
306fa1
+		char *estr = strerror_r(errno, buf, sizeof(buf));
306fa1
+		crit(logopt, "malloc: %s", estr);
306fa1
 		return -1;
306fa1
+	}
306fa1
+	memset(argv, 0, argv_len);
306fa1
 
306fa1
 	va_start(arg, prog);
306fa1
 	p = argv;
306fa1
 	while ((*p++ = va_arg(arg, char *)));
306fa1
 	va_end(arg);
306fa1
 
306fa1
-	return do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
306fa1
+	ret = do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
306fa1
+	free(argv);
306fa1
+
306fa1
+	return ret;
306fa1
 }
306fa1
 
306fa1
 int spawn_mount(unsigned logopt, ...)
306fa1
@@ -533,6 +544,7 @@ int spawn_mount(unsigned logopt, ...)
306fa1
 	int update_mtab = 1, ret, printed = 0;
306fa1
 	unsigned int wait = defaults_get_mount_wait();
306fa1
 	char buf[PATH_MAX + 1];
306fa1
+	unsigned int argv_len;
306fa1
 
306fa1
 	/* If we use mount locking we can't validate the location */
306fa1
 #ifdef ENABLE_MOUNT_LOCKING
306fa1
@@ -558,8 +570,15 @@ int spawn_mount(unsigned logopt, ...)
306fa1
 	}
306fa1
 
306fa1
 	/* Alloc 1 extra slot in case we need to use the "-f" option */
306fa1
-	if (!(argv = alloca(sizeof(char *) * (argc + 2))))
306fa1
+	argv_len = sizeof(char *) * (argc + 2);
306fa1
+	argv = malloc(argv_len);
306fa1
+	if (!argv) {
306fa1
+		char buf[MAX_ERR_BUF];
306fa1
+		char *estr = strerror_r(errno, buf, sizeof(buf));
306fa1
+		crit(logopt, "malloc: %s", estr);
306fa1
 		return -1;
306fa1
+	}
306fa1
+	memset(argv, 0, argv_len);
306fa1
 
306fa1
 	argv[0] = arg0;
306fa1
 
306fa1
@@ -634,6 +653,7 @@ int spawn_mount(unsigned logopt, ...)
306fa1
 		umount(argv[argc]);
306fa1
 		ret = MNT_FORCE_FAIL;
306fa1
 	}
306fa1
+	free(argv);
306fa1
 
306fa1
 	return ret;
306fa1
 }
306fa1
@@ -661,6 +681,7 @@ int spawn_bind_mount(unsigned logopt, ..
306fa1
 	unsigned int retries = MTAB_LOCK_RETRIES;
306fa1
 	int update_mtab = 1, ret, printed = 0;
306fa1
 	char buf[PATH_MAX + 1];
306fa1
+	unsigned int argv_len;
306fa1
 
306fa1
 	/* If we use mount locking we can't validate the location */
306fa1
 #ifdef ENABLE_MOUNT_LOCKING
306fa1
@@ -689,8 +710,15 @@ int spawn_bind_mount(unsigned logopt, ..
306fa1
 		}
306fa1
 	}
306fa1
 
306fa1
-	if (!(argv = alloca(sizeof(char *) * (argc + 2))))
306fa1
+	argv_len = sizeof(char *) * (argc + 2);
306fa1
+	argv = malloc(argv_len);
306fa1
+	if (!argv) {
306fa1
+		char buf[MAX_ERR_BUF];
306fa1
+		char *estr = strerror_r(errno, buf, sizeof(buf));
306fa1
+		crit(logopt, "malloc: %s", estr);
306fa1
 		return -1;
306fa1
+	}
306fa1
+	memset(argv, 0, argv_len);
306fa1
 
306fa1
 	argv[0] = arg0;
306fa1
 	argv[1] = bind;
306fa1
@@ -752,6 +780,7 @@ int spawn_bind_mount(unsigned logopt, ..
306fa1
 		umount(argv[argc]);
306fa1
 		ret = MNT_FORCE_FAIL;
306fa1
 	}
306fa1
+	free(argv);
306fa1
 
306fa1
 	return ret;
306fa1
 }
306fa1
@@ -769,6 +798,7 @@ int spawn_umount(unsigned logopt, ...)
306fa1
 	int update_mtab = 1, ret, printed = 0;
306fa1
 	unsigned int wait = defaults_get_umount_wait();
306fa1
 	char buf[PATH_MAX + 1];
306fa1
+	unsigned int argv_len;
306fa1
 
306fa1
 #ifdef ENABLE_MOUNT_LOCKING
306fa1
 	options = SPAWN_OPT_LOCK;
306fa1
@@ -792,8 +822,15 @@ int spawn_umount(unsigned logopt, ...)
306fa1
 		}
306fa1
 	}
306fa1
 
306fa1
-	if (!(argv = alloca(sizeof(char *) * argc + 1)))
306fa1
+	argv_len = sizeof(char *) * (argc + 1);
306fa1
+	argv = malloc(argv_len);
306fa1
+	if (!argv) {
306fa1
+		char buf[MAX_ERR_BUF];
306fa1
+		char *estr = strerror_r(errno, buf, sizeof(buf));
306fa1
+		crit(logopt, "malloc: %s", estr);
306fa1
 		return -1;
306fa1
+	}
306fa1
+	memset(argv, 0, argv_len);
306fa1
 
306fa1
 	argv[0] = arg0;
306fa1
 
306fa1
@@ -841,6 +878,7 @@ int spawn_umount(unsigned logopt, ...)
306fa1
 		     "and /etc/mtab will differ");
306fa1
 		ret = 0;
306fa1
 	}
306fa1
+	free(argv);
306fa1
 
306fa1
 	return ret;
306fa1
 }