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