]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 12 Apr 2000 06:08:31 +0000 (06:08 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 12 Apr 2000 06:08:31 +0000 (06:08 +0000)
* sysdeps/unix/sysv/linux/shm_open.c (shm_open): Set FD_CLOEXEC
for descriptor.

ChangeLog
sysdeps/unix/sysv/linux/shm_open.c

index fcecf3613f256c3dbef36aa6e6ea95102a9cdc2d..61e7fd5b589db450751f466afa5e22bffd35de7d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2000-04-11  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/unix/sysv/linux/shm_open.c (shm_open): Set FD_CLOEXEC
+       for descriptor.
+
        * misc/sys/mman.h: Add prototypes for shm_open and shm_unlink.
        * rt/Makefile (librt-routines): Add shm_open and shm_unlink.
        * rt/Versions [librt] (GLIBC_2.2): Add shm_open and shm_unlink.
index 08bdaeadbd97f955b7460adbe62ce82385c0b590..ca24424b7805a02b4a248fd707351b44b02f2508 100644 (file)
@@ -121,6 +121,7 @@ shm_open (const char *name, int oflag, mode_t mode)
 {
   size_t namelen;
   char *fname;
+  int fd;
 
   /* Determine where the shmfs is mounted.  */
   __libc_once (once, where_is_shmfs);
@@ -153,7 +154,29 @@ shm_open (const char *name, int oflag, mode_t mode)
      file on the shmfs.  If this is what should be done the whole function
      should be revamped since we can determine whether shmfs is available
      while trying to open the file, all in one turn.  */
-  return open (fname, oflag, mode);
+  fd = open (fname, oflag, mode);
+  if (fd != -1)
+    {
+      /* We got a descriptor.  Now set the FD_CLOEXEC bit.  */
+      int flags = fcntl (fd, F_GETFD, 0);
+
+      if (__builtin_expect (flags, 0) >= 0)
+       {
+         flags |= FD_CLOEXEC;
+         flags = fcntl (fd, F_SETFD, flags);
+       }
+
+      if (flags == -1)
+       {
+         /* Something went wrong.  We cannot return the descriptor.  */
+         int save_errno = errno;
+         close (fd);
+         fd = -1;
+         __set_errno (save_errno);
+       }
+    }
+
+  return fd;
 }