about summary refs log tree commit diff
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
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')
-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;
 }