--- src/base/os_defs.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/src/base/os_defs.c b/src/base/os_defs.c index 6f9ec52..e914011 100644 --- a/src/base/os_defs.c +++ b/src/base/os_defs.c @@ -1052,14 +1052,29 @@ uint32_t ncs_os_process_execute_timed(NCS_OS_PROC_EXECUTE_TIMED_INFO *req) * child */ if (getenv("OPENSAF_KEEP_FD_OPEN_AFTER_FORK") == NULL) { /* Close all inherited file descriptors */ - int i = sysconf(_SC_OPEN_MAX); - if (i == -1) { + int fd_max = sysconf(_SC_OPEN_MAX); + + if (fd_max == -1) { syslog(LOG_ERR, "%s: sysconf failed - %s", - __FUNCTION__, strerror(errno)); + __FUNCTION__, strerror(errno)); exit(EXIT_FAILURE); } - for (i--; i >= 0; --i) - (void)close(i); /* close all descriptors */ + struct dirent *pentry = NULL; + DIR *dir = opendir("/proc/self/fd"); + + if (dir != NULL) { + while ((pentry = readdir(dir)) != NULL) { + int fd = strtoimax(pentry->d_name, NULL, 10); + if (fd > INT_MIN && fd < fd_max) (void)close(fd); + } + (void)closedir(dir); + } else { + /* fall back, close all possible descriptors */ + syslog(LOG_ERR, "%s: opendir failed - %s", + __FUNCTION__, strerror(errno)); + for (fd_max--; fd_max >= 0; --fd_max) + (void)close(fd_max); + } /* Redirect standard files to /dev/null */ if (freopen("/dev/null", "r", stdin) == NULL) -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel