]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/posix/shm_open.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / posix / shm_open.c
index f2961620b4b0457316dda84ac278ba69fba16720..f8a28f2f228373cce42fc087a98932e50480e344 100644 (file)
@@ -1,5 +1,5 @@
 /* shm_open -- open a POSIX shared memory object.  Generic POSIX file version.
-   Copyright (C) 2001-2016 Free Software Foundation, Inc.
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -25,6 +25,7 @@
 #else
 
 # include <fcntl.h>
+# include <pthread.h>
 # include <shm-directory.h>
 
 
@@ -34,12 +35,12 @@ shm_open (const char *name, int oflag, mode_t mode)
 {
   SHM_GET_NAME (EINVAL, -1, "");
 
-# ifdef O_NOFOLLOW
-  oflag |= O_NOFOLLOW;
-# endif
-# ifdef O_CLOEXEC
-  oflag |= O_CLOEXEC;
-# endif
+  oflag |= O_NOFOLLOW | O_CLOEXEC;
+
+  /* Disable asynchronous cancellation.  */
+  int state;
+  pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state);
+
   int fd = open (shm_name, oflag, mode);
   if (fd == -1 && __glibc_unlikely (errno == EISDIR))
     /* It might be better to fold this error with EINVAL since
@@ -47,28 +48,7 @@ shm_open (const char *name, int oflag, mode_t mode)
        object names and the standard does not mention EISDIR.  */
     __set_errno (EINVAL);
 
-# ifndef O_CLOEXEC
-  if (fd != -1)
-    {
-      /* We got a descriptor.  Now set the FD_CLOEXEC bit.  */
-      int flags = fcntl (fd, F_GETFD, 0);
-
-      if (__glibc_likely (flags != -1))
-       {
-         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);
-       }
-    }
-# endif
+  pthread_setcancelstate (state, NULL);
 
   return fd;
 }