From bf6749a7f87c54e62db26b24c63b27004a110847 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 17 Jun 2021 09:45:03 -0300 Subject: nptl: Use SA_RESTART for SIGCANCEL handler The usage of signals to implementation pthread cancellation is an implementation detail and should not be visible through cancellation entrypoints. However now that pthread_cancel always send the SIGCANCEL, some entrypoint might be interruptable and return EINTR to the caller (for instance on sem_wait). Using SA_RESTART hides this, since the cancellation handler should either act uppon cancellation (if asynchronous cancellation is enable) or ignore the cancellation internal signal. Checked on x86_64-linux-gnu and i686-linux-gnu. --- nptl/pthread_cancel.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'nptl') diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 0698cd2..cc25ff2 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); -- cgit v1.1