summaryrefslogtreecommitdiff
path: root/sysdeps/posix
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2016-08-22 10:31:42 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2016-09-15 11:15:14 -0300
commitfbc994921b459d57b681a926780933a20745edf5 (patch)
tree5439819eecf6c01b3ca526168a69e73ee6c21785 /sysdeps/posix
parent47677f2edc815e85d0383a89b09733e95e5d7302 (diff)
downloadglibc-fbc994921b459d57b681a926780933a20745edf5.tar.gz
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')
-rw-r--r--sysdeps/posix/shm_open.c7
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;
}