/* 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
#else
# include <fcntl.h>
+# include <pthread.h>
# include <shm-directory.h>
{
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
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;
}