Ian Kent 9a5a39
autofs-5.0.4 - use CLOEXEC flag for setmntent
Ian Kent 9a5a39
Ian Kent 9a5a39
From: Ian Kent <raven@themaw.net>
Ian Kent 9a5a39
Ian Kent 9a5a39
Update use of CLOEXEC functionality to cover setmntent(3)
Ian Kent 9a5a39
calls as well.
Ian Kent 9a5a39
---
Ian Kent 9a5a39
Ian Kent 9a5a39
 CHANGELOG           |    1 +
Ian Kent 9a5a39
 include/automount.h |   20 ++++++++++++++++++++
Ian Kent 9a5a39
 lib/mounts.c        |    8 ++++----
Ian Kent 9a5a39
 3 files changed, 25 insertions(+), 4 deletions(-)
Ian Kent 9a5a39
Ian Kent 9a5a39
Ian Kent 9a5a39
--- autofs-5.0.4.orig/CHANGELOG
Ian Kent 9a5a39
+++ autofs-5.0.4/CHANGELOG
Ian Kent 9a5a39
@@ -8,6 +8,7 @@
Ian Kent 9a5a39
 - make hash table scale to thousands of entries (Paul Wankadia,
Ian Kent 9a5a39
   Valerie Aurora Henson).
Ian Kent 9a5a39
 - clear the quoted flag after each character from program map input.
Ian Kent 9a5a39
+- use CLOEXEC flag for setmntent also.
Ian Kent 9a5a39
 
Ian Kent 9a5a39
 4/11/2008 autofs-5.0.4
Ian Kent 9a5a39
 -----------------------
Ian Kent 9a5a39
--- autofs-5.0.4.orig/include/automount.h
Ian Kent 9a5a39
+++ autofs-5.0.4/include/automount.h
Ian Kent 9a5a39
@@ -581,5 +581,25 @@ static inline FILE *open_fopen_r(const c
Ian Kent 9a5a39
 	return f;
Ian Kent 9a5a39
 }
Ian Kent 9a5a39
 
Ian Kent 9a5a39
+static inline FILE *open_setmntent_r(const char *table)
Ian Kent 9a5a39
+{
Ian Kent 9a5a39
+	FILE *tab;
Ian Kent 9a5a39
+
Ian Kent 9a5a39
+#if defined(O_CLOEXEC) && defined(SOCK_CLOEXEC)
Ian Kent 9a5a39
+	if (cloexec_works != -1) {
Ian Kent 9a5a39
+		tab = setmntent(table, "re");
Ian Kent 9a5a39
+		if (tab != NULL) {
Ian Kent 9a5a39
+			check_cloexec(fileno(tab));
Ian Kent 9a5a39
+			return tab;
Ian Kent 9a5a39
+		}
Ian Kent 9a5a39
+	}
Ian Kent 9a5a39
+#endif
Ian Kent 9a5a39
+	tab = fopen(table, "r");
Ian Kent 9a5a39
+	if (tab == NULL)
Ian Kent 9a5a39
+		return NULL;
Ian Kent 9a5a39
+	check_cloexec(fileno(tab));
Ian Kent 9a5a39
+	return tab;
Ian Kent 9a5a39
+}
Ian Kent 9a5a39
+
Ian Kent 9a5a39
 #endif
Ian Kent 9a5a39
 
Ian Kent 9a5a39
--- autofs-5.0.4.orig/lib/mounts.c
Ian Kent 9a5a39
+++ autofs-5.0.4/lib/mounts.c
Ian Kent 9a5a39
@@ -218,7 +218,7 @@ struct mnt_list *get_mnt_list(const char
Ian Kent 9a5a39
 	if (!path || !pathlen || pathlen > PATH_MAX)
Ian Kent 9a5a39
 		return NULL;
Ian Kent 9a5a39
 
Ian Kent 9a5a39
-	tab = setmntent(table, "r");
Ian Kent 9a5a39
+	tab = open_setmntent_r(table);
Ian Kent 9a5a39
 	if (!tab) {
Ian Kent 9a5a39
 		char *estr = strerror_r(errno, buf, PATH_MAX - 1);
Ian Kent 9a5a39
 		logerr("setmntent: %s", estr);
Ian Kent 9a5a39
@@ -415,7 +415,7 @@ static int table_is_mounted(const char *
Ian Kent 9a5a39
 	if (!path || !pathlen || pathlen >= PATH_MAX)
Ian Kent 9a5a39
 		return 0;
Ian Kent 9a5a39
 
Ian Kent 9a5a39
-	tab = setmntent(table, "r");
Ian Kent 9a5a39
+	tab = open_setmntent_r(table);
Ian Kent 9a5a39
 	if (!tab) {
Ian Kent 9a5a39
 		char *estr = strerror_r(errno, buf, PATH_MAX - 1);
Ian Kent 9a5a39
 		logerr("setmntent: %s", estr);
Ian Kent 9a5a39
@@ -489,7 +489,7 @@ int has_fstab_option(const char *opt)
Ian Kent 9a5a39
 	if (!opt)
Ian Kent 9a5a39
 		return 0;
Ian Kent 9a5a39
 
Ian Kent 9a5a39
-	tab = setmntent(_PATH_MNTTAB, "r");
Ian Kent 9a5a39
+	tab = open_setmntent_r(_PATH_MNTTAB);
Ian Kent 9a5a39
 	if (!tab) {
Ian Kent 9a5a39
 		char *estr = strerror_r(errno, buf, PATH_MAX - 1);
Ian Kent 9a5a39
 		logerr("setmntent: %s", estr);
Ian Kent 9a5a39
@@ -668,7 +668,7 @@ struct mnt_list *tree_make_mnt_tree(cons
Ian Kent 9a5a39
 	size_t plen;
Ian Kent 9a5a39
 	int eq;
Ian Kent 9a5a39
 
Ian Kent 9a5a39
-	tab = setmntent(table, "r");
Ian Kent 9a5a39
+	tab = open_setmntent_r(table);
Ian Kent 9a5a39
 	if (!tab) {
Ian Kent 9a5a39
 		char *estr = strerror_r(errno, buf, PATH_MAX - 1);
Ian Kent 9a5a39
 		logerr("setmntent: %s", estr);