diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-12-07 17:17:24 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-09 15:16:45 -0300 |
commit | a6c813d0ad0fd9830f2cd3c3d079af8d2aa50a1f (patch) | |
tree | 4a76233e9a815b23428b380ec689491ec9b8f7b4 /nptl/pthread_kill.c | |
parent | f779b1efb35fe141e47952af3ac7f0540acca401 (diff) | |
download | glibc-a6c813d0ad0fd9830f2cd3c3d079af8d2aa50a1f.tar.gz glibc-a6c813d0ad0fd9830f2cd3c3d079af8d2aa50a1f.tar.xz glibc-a6c813d0ad0fd9830f2cd3c3d079af8d2aa50a1f.zip |
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 db988e50a87f613cb6b9e98a2fc66a4848bc3546 fixed for pthread_join). Checked on x86_64-linux-gnu and aarch64-linux-gnu.
Diffstat (limited to 'nptl/pthread_kill.c')
-rw-r--r-- | nptl/pthread_kill.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c index 8982011ba8..f79a2b26fc 100644 --- a/nptl/pthread_kill.c +++ b/nptl/pthread_kill.c @@ -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) |