summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS8
-rw-r--r--nptl/pthread_cancel.c6
2 files changed, 13 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index d64be288da..48d77d706f 100644
--- a/NEWS
+++ b/NEWS
@@ -64,6 +64,14 @@ Deprecated and removed features, and other changes affecting compatibility:
* The function pthread_yield has been deprecated; programs should use
the equivalent standard function sched_yield instead.
+* The pthread cancellation handler is now installed with SA_RESTART and
+ pthread_cancel will always send the internal SIGCANCEL on a cancellation
+ request. It should not be visible to application since the cancellation
+ handler should either act upon cancellation (if asynchronous cancellation
+ is enabled) or ignore the cancellation internal signal. However there are
+ buggy kernel interfaces (for instance some CIFS version) that could still
+ see spurious EINTR error when cancellation interrupts a blocking syscall.
+
Changes to build and runtime requirements:
* On Linux, the shm_open, sem_open, and related functions now expect the
diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c
index 0698cd2046..cc25ff21f3 100644
--- a/nptl/pthread_cancel.c
+++ b/nptl/pthread_cancel.c
@@ -72,7 +72,11 @@ __pthread_cancel (pthread_t th)
{
struct sigaction sa;
sa.sa_sigaction = sigcancel_handler;
- sa.sa_flags = SA_SIGINFO;
+ /* The signal handle should be non-interruptible to avoid the risk of
+ spurious EINTR caused by SIGCANCEL sent to process or if
+ pthread_cancel() is called while cancellation is disabled in the
+ target thread. */
+ sa.sa_flags = SA_SIGINFO | SA_RESTART;
__sigemptyset (&sa.sa_mask);
__libc_sigaction (SIGCANCEL, &sa, NULL);
atomic_store_relaxed (&init_sigcancel, 1);