>From 4faf8a77c0e24e7dbd945e7fdad6961a63335910 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 27 May 2020 20:16:33 +0200 Subject: [PATCH 17/18] getloadavg: Make more robust in multithreaded applications. * lib/getloadavg.c (getloadavg): Pass an O_CLOEXEC flag to open(). Simplify use of O_CLOEXEC. * modules/getloadavg (Depends-on): Add 'open'. --- ChangeLog | 7 +++++++ lib/getloadavg.c | 22 +++------------------- modules/getloadavg | 1 + 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4946b1d..e60de12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2020-05-27 Bruno Haible + getloadavg: Make more robust in multithreaded applications. + * lib/getloadavg.c (getloadavg): Pass an O_CLOEXEC flag to open(). + Simplify use of O_CLOEXEC. + * modules/getloadavg (Depends-on): Add 'open'. + +2020-05-27 Bruno Haible + vma-iter: Make more robust in multithreaded applications. * lib/vma-iter.c (rof_open, vma_iterate): Pass an O_CLOEXEC flag to open(). diff --git a/lib/getloadavg.c b/lib/getloadavg.c index 7e11c32..61307d3 100644 --- a/lib/getloadavg.c +++ b/lib/getloadavg.c @@ -512,7 +512,7 @@ getloadavg (double loadavg[], int nelem) char const *ptr = ldavgbuf; int fd, count, saved_errno; - fd = open (LINUX_LDAV_FILE, O_RDONLY); + fd = open (LINUX_LDAV_FILE, O_RDONLY | O_CLOEXEC); if (fd == -1) return -1; count = read (fd, ldavgbuf, sizeof ldavgbuf - 1); @@ -869,27 +869,11 @@ getloadavg (double loadavg[], int nelem) if (!getloadavg_initialized) { # ifndef SUNOS_5 - /* Set the channel to close on exec, so it does not - litter any child's descriptor table. */ -# ifndef O_CLOEXEC -# define O_CLOEXEC 0 -# endif int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC); if (0 <= fd) { -# if F_DUPFD_CLOEXEC - if (fd <= STDERR_FILENO) - { - int fd1 = fcntl (fd, F_DUPFD_CLOEXEC, STDERR_FILENO + 1); - close (fd); - fd = fd1; - } -# endif - if (0 <= fd) - { - channel = fd; - getloadavg_initialized = true; - } + channel = fd; + getloadavg_initialized = true; } # else /* SUNOS_5 */ /* We pass 0 for the kernel, corefile, and swapfile names diff --git a/modules/getloadavg b/modules/getloadavg index e14ddc8..a5a3c4e 100644 --- a/modules/getloadavg +++ b/modules/getloadavg @@ -9,6 +9,7 @@ Depends-on: extensions fopen-gnu intprops +open stdbool stdlib -- 2.7.4