forked from pool/glibc
Andreas Schwab
4d4a3834ee
- ld-show-auxv-colon.patch: elf: Fix missing colon in LD_SHOW_AUXV output (BZ #282539 - x86-string-control-test.patch: x86-64: Use testl to check __x86_string_control - pthread-kill-fail-after-exit.patch: nptl: pthread_kill, pthread_cancel should not fail after exit (BZ #19193) - pthread-kill-race-thread-exit.patch: nptl: Fix race between pthread_kill and thread exit (BZ #12889) - getcwd-attribute-access.patch: posix: Fix attribute access mode on getcwd (BZ #27476) - pthread-kill-return-esrch.patch: nptl: pthread_kill needs to return ESRCH for old programs (BZ #19193) - pthread-mutexattr-getrobust-np-type.patch: nptl: Fix type of pthread_mutexattr_getrobust_np, pthread_mutexattr_setrobust_np (BZ #28036) - setxid-deadlock-blocked-signals.patch: nptl: Avoid setxid deadlock with blocked signals in thread exit (BZ #28361) - pthread-kill-send-specific-thread.patch: nptl: pthread_kill must send signals to a specific thread (BZ #28407) - sysconf-nprocessors-affinity.patch: linux: Revert the use of sched_getaffinity on get_nproc (BZ #28310) - iconv-charmap-close-output.patch: renamed from icon-charmap-close-output.patch OBS-URL: https://build.opensuse.org/request/show/923222 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=604
92 lines
3.3 KiB
Diff
92 lines
3.3 KiB
Diff
From 73c7f5a87971de2797f261e1a447f68dce09284b Mon Sep 17 00:00:00 2001
|
|
From: Florian Weimer <fweimer@redhat.com>
|
|
Date: Mon, 20 Sep 2021 14:56:08 +0200
|
|
Subject: [PATCH] nptl: pthread_kill needs to return ESRCH for old programs
|
|
(bug 19193)
|
|
|
|
The fix for bug 19193 breaks some old applications which appear
|
|
to use pthread_kill to probe if a thread is still running, something
|
|
that is not supported by POSIX.
|
|
|
|
(cherry picked from commit 95dba35bf05e4a5d69dfae5e9c9d4df3646a7f93)
|
|
---
|
|
nptl/pthread_kill.c | 37 ++++++++++++++++++-----
|
|
sysdeps/pthread/tst-pthread_kill-exited.c | 21 +++++++++++--
|
|
2 files changed, 48 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c
|
|
index fb7862eff7..a44dc8f2d9 100644
|
|
--- a/nptl/pthread_kill.c
|
|
+++ b/nptl/pthread_kill.c
|
|
@@ -21,8 +21,11 @@
|
|
#include <pthreadP.h>
|
|
#include <shlib-compat.h>
|
|
|
|
-int
|
|
-__pthread_kill_internal (pthread_t threadid, int signo)
|
|
+/* Sends SIGNO to THREADID. If the thread is about to exit or has
|
|
+ already exited on the kernel side, return NO_TID. Otherwise return
|
|
+ 0 or an error code. */
|
|
+static int
|
|
+__pthread_kill_implementation (pthread_t threadid, int signo, int no_tid)
|
|
{
|
|
struct pthread *pd = (struct pthread *) threadid;
|
|
if (pd == THREAD_SELF)
|
|
@@ -52,11 +55,8 @@ __pthread_kill_internal (pthread_t threadid, int signo)
|
|
signal is either not observable (the target thread has already
|
|
blocked signals at this point), or it will fail, or it might be
|
|
delivered to a new, unrelated thread that has reused the TID.
|
|
- So do not actually send the signal. Do not report an error
|
|
- because the threadid argument is still valid (the thread ID
|
|
- lifetime has not ended), and ESRCH (for example) would be
|
|
- misleading. */
|
|
- ret = 0;
|
|
+ So do not actually send the signal. */
|
|
+ ret = no_tid;
|
|
else
|
|
{
|
|
/* Using tgkill is a safety measure. pd->exit_lock ensures that
|
|
@@ -71,6 +71,15 @@ __pthread_kill_internal (pthread_t threadid, int signo)
|
|
return ret;
|
|
}
|
|
|
|
+int
|
|
+__pthread_kill_internal (pthread_t threadid, int signo)
|
|
+{
|
|
+ /* Do not report an error in the no-tid case because the threadid
|
|
+ argument is still valid (the thread ID lifetime has not ended),
|
|
+ and ESRCH (for example) would be misleading. */
|
|
+ return __pthread_kill_implementation (threadid, signo, 0);
|
|
+}
|
|
+
|
|
int
|
|
__pthread_kill (pthread_t threadid, int signo)
|
|
{
|
|
@@ -81,6 +90,7 @@ __pthread_kill (pthread_t threadid, int signo)
|
|
|
|
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)
|
|
@@ -88,6 +98,17 @@ libc_hidden_def (__pthread_kill)
|
|
versioned_symbol (libc, __pthread_kill, pthread_kill, GLIBC_2_34);
|
|
|
|
# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34)
|
|
-compat_symbol (libc, __pthread_kill, pthread_kill, GLIBC_2_0);
|
|
+/* Variant which returns ESRCH in the no-TID case, for backwards
|
|
+ compatibility. */
|
|
+int
|
|
+attribute_compat_text_section
|
|
+__pthread_kill_esrch (pthread_t threadid, int signo)
|
|
+{
|
|
+ if (__is_internal_signal (signo))
|
|
+ return EINVAL;
|
|
+
|
|
+ return __pthread_kill_implementation (threadid, signo, ESRCH);
|
|
+}
|
|
+compat_symbol (libc, __pthread_kill_esrch, pthread_kill, GLIBC_2_0);
|
|
# endif
|
|
#endif
|