diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-08-22 10:31:42 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-09-15 11:15:14 -0300 |
commit | fbc994921b459d57b681a926780933a20745edf5 (patch) | |
tree | 5439819eecf6c01b3ca526168a69e73ee6c21785 /sysdeps/posix/shm_open.c | |
parent | 47677f2edc815e85d0383a89b09733e95e5d7302 (diff) | |
download | glibc-fbc994921b459d57b681a926780933a20745edf5.tar.gz glibc-fbc994921b459d57b681a926780933a20745edf5.tar.xz glibc-fbc994921b459d57b681a926780933a20745edf5.zip |
rt: Set shm_open as a non cancellation point (BZ #18243)
This patch changes shm_open to not act as a cancellation point. Cancellation is disable at start and reenable in function exit. It fixes BZ #18243. Tested on x86_64 and i686. [BZ #18243] * rt/Makefile (test): Add tst-shm-cancel. * rt/tst-shm-cancel.c: New file. * sysdeps/posix/shm_open.c: Disable asynchronous cancellation.
Diffstat (limited to 'sysdeps/posix/shm_open.c')
-rw-r--r-- | sysdeps/posix/shm_open.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index f2961620b4..0182e7baf5 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -40,6 +40,11 @@ shm_open (const char *name, int oflag, mode_t mode) # ifdef O_CLOEXEC oflag |= O_CLOEXEC; # endif + + /* 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 @@ -70,6 +75,8 @@ shm_open (const char *name, int oflag, mode_t mode) } # endif + pthread_setcancelstate (state, NULL); + return fd; } |