]> Savannah Git Hosting - gnulib.git/commitdiff
getloadavg: Make more robust in multithreaded applications.
authorBruno Haible <bruno@clisp.org>
Wed, 27 May 2020 18:16:33 +0000 (20:16 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 28 May 2020 19:40:23 +0000 (21:40 +0200)
* lib/getloadavg.c (getloadavg): Pass an O_CLOEXEC flag to open().
Simplify use of O_CLOEXEC.
* modules/getloadavg (Depends-on): Add 'open'.

ChangeLog
lib/getloadavg.c
modules/getloadavg

index 0f700126d46d01815b72b5432bc1e26e0ae7f870..916f9cf94502bb8e46b819ca9215d0dc03fd1cb5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2020-05-28  Bruno Haible  <bruno@clisp.org>
+
+       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-28  Bruno Haible  <bruno@clisp.org>
 
        vma-iter: Make more robust in multithreaded applications.
index 7e11c3208e726967f6dfedcf3e02a10e83a1cf5d..61307d3772a391776d7be58fb98a2657d69408c3 100644 (file)
@@ -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
index e14ddc8552c82daf8462d06531fb29ca8d4cc370..a5a3c4e03cf45b08f67adb8b18e25cf2b243dc72 100644 (file)
@@ -9,6 +9,7 @@ Depends-on:
 extensions
 fopen-gnu
 intprops
+open
 stdbool
 stdlib