1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

nptl: Use pthread_kill on pthread_cancel

It consolidates the tgkill call and it is the first step of making
pthread_cancel async-signal-safe.  It also fix a possible issue
where the 'struct pthread' tid is not read atomically, which might
send an invalid cancellation signal (similar to what
db988e50a8 fixed for pthread_join).

Checked on x86_64-linux-gnu and aarch64-linux-gnu.
This commit is contained in:
Adhemerval Zanella
2020-12-07 17:17:24 -03:00
parent f779b1efb3
commit a6c813d0ad
3 changed files with 15 additions and 11 deletions

View File

@@ -21,13 +21,8 @@
#include <shlib-compat.h>
int
__pthread_kill (pthread_t threadid, int signo)
__pthread_kill_internal (pthread_t threadid, int signo)
{
/* Disallow sending the signal we use for cancellation, timers,
for the setxid implementation. */
if (__is_internal_signal (signo))
return EINVAL;
pid_t tid;
struct pthread *pd = (struct pthread *) threadid;
@@ -55,6 +50,17 @@ __pthread_kill (pthread_t threadid, int signo)
return val;
}
int
__pthread_kill (pthread_t threadid, int signo)
{
/* Disallow sending the signal we use for cancellation, timers,
for the setxid implementation. */
if (__is_internal_signal (signo))
return EINVAL;
return __pthread_kill_internal (threadid, signo);
}
/* Some architectures (for instance arm) might pull raise through libgcc, so
avoid the symbol version if it ends up being used on ld.so. */
#if !IS_IN(rtld)