about summary refs log tree commit diff
path: root/nptl/pthread_kill.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-12-07 17:17:24 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-06-09 15:16:45 -0300
commita6c813d0ad0fd9830f2cd3c3d079af8d2aa50a1f (patch)
tree4a76233e9a815b23428b380ec689491ec9b8f7b4 /nptl/pthread_kill.c
parentf779b1efb35fe141e47952af3ac7f0540acca401 (diff)
downloadglibc-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.c18
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)