diff options
Diffstat (limited to 'sysdeps/posix/shm_open.c')
-rw-r--r-- | sysdeps/posix/shm_open.c | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index f2961620b4..b9b473ceed 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -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-2018 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; } |