From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: [PATCH 06/11] nptl: Install cancellation handler on pthread_cancel
Date: Wed, 26 May 2021 13:57:23 -0300 [thread overview]
Message-ID: <20210526165728.1772546-7-adhemerval.zanella@linaro.org> (raw)
In-Reply-To: <20210526165728.1772546-1-adhemerval.zanella@linaro.org>
Now that cancellation is not used anymore to handle thread setup
creation failure, the sighandle can be installed only when
pthread_cancel is actually used.
Checked on x86_64-linux-gnu and aarch64-linux-gnu.
---
nptl/Versions | 3 +--
nptl/pthreadP.h | 6 ------
nptl/pthread_cancel.c | 49 ++++++++++++++++++++++++-------------------
nptl/pthread_create.c | 15 -------------
4 files changed, 28 insertions(+), 45 deletions(-)
diff --git a/nptl/Versions b/nptl/Versions
index af62a47cca..590761e730 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -395,7 +395,6 @@ libc {
__nptl_free_tcb;
__nptl_nthreads;
__nptl_setxid_sighandler;
- __nptl_sigcancel_handler;
__nptl_stack_list_add;
__nptl_stack_list_del;
__pthread_attr_copy;
@@ -514,4 +513,4 @@ ld {
__nptl_initial_report_events;
__nptl_set_robust_list_avail;
}
-}
\ No newline at end of file
+}
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 05f2bae521..48d48e7008 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -569,12 +569,6 @@ libc_hidden_proto (__pthread_attr_setsigmask_internal)
extern __typeof (pthread_attr_getsigmask_np) __pthread_attr_getsigmask_np;
libc_hidden_proto (__pthread_attr_getsigmask_np)
-/* The cancellation signal handler defined alongside with
- pthread_cancel. This is included in statically linked binaries
- only if pthread_cancel is linked in. */
-void __nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx);
-libc_hidden_proto (__nptl_sigcancel_handler)
-
/* Special versions which use non-exported functions. */
extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
void (*routine) (void *), void *arg);
diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c
index 802c691874..f264a4096a 100644
--- a/nptl/pthread_cancel.c
+++ b/nptl/pthread_cancel.c
@@ -28,11 +28,19 @@
#include <gnu/lib-names.h>
#include <sys/single_threaded.h>
-/* For asynchronous cancellation we use a signal. This is the core
- logic of the signal handler. */
+/* For asynchronous cancellation we use a signal. */
static void
-sigcancel_handler (void)
+sigcancel_handler (int sig, siginfo_t *si, void *ctx)
{
+ /* Safety check. It would be possible to call this function for
+ other signals and send a signal from another process. This is not
+ correct and might even be a security problem. Try to catch as
+ many incorrect invocations as possible. */
+ if (sig != SIGCANCEL
+ || si->si_pid != __getpid()
+ || si->si_code != SI_TKILL)
+ return;
+
struct pthread *self = THREAD_SELF;
int oldval = THREAD_GETMEM (self, cancelhandling);
@@ -66,24 +74,6 @@ sigcancel_handler (void)
}
}
-/* This is the actually installed SIGCANCEL handler. It adds some
- safety checks before performing the cancellation. */
-void
-__nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx)
-{
- /* Safety check. It would be possible to call this function for
- other signals and send a signal from another process. This is not
- correct and might even be a security problem. Try to catch as
- many incorrect invocations as possible. */
- if (sig != SIGCANCEL
- || si->si_pid != __getpid()
- || si->si_code != SI_TKILL)
- return;
-
- sigcancel_handler ();
-}
-libc_hidden_def (__nptl_sigcancel_handler)
-
int
__pthread_cancel (pthread_t th)
{
@@ -94,6 +84,17 @@ __pthread_cancel (pthread_t th)
/* Not a valid thread handle. */
return ESRCH;
+ static int init_sigcancel = 0;
+ if (atomic_load_relaxed (&init_sigcancel) == 0)
+ {
+ struct sigaction sa;
+ sa.sa_sigaction = sigcancel_handler;
+ sa.sa_flags = SA_SIGINFO;
+ __sigemptyset (&sa.sa_mask);
+ __libc_sigaction (SIGCANCEL, &sa, NULL);
+ atomic_store_relaxed (&init_sigcancel, 1);
+ }
+
#ifdef SHARED
/* Trigger an error if libgcc_s cannot be loaded. */
{
@@ -134,7 +135,11 @@ __pthread_cancel (pthread_t th)
call pthread_cancel (pthread_self ()) without calling
pthread_create, so the signal handler may not have been
set up for a self-cancel. */
- sigcancel_handler ();
+ {
+ THREAD_SETMEM (pd, result, PTHREAD_CANCELED);
+ if ((newval & CANCELTYPE_BITMASK) != 0)
+ __do_cancel ();
+ }
else
{
/* The cancellation handler will take care of marking the
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index d6b907827a..44d135212d 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -68,21 +68,6 @@ late_init (void)
struct sigaction sa;
__sigemptyset (&sa.sa_mask);
- /* Install the cancellation signal handler (in static builds only if
- pthread_cancel has been linked in). If for some reason we cannot
- install the handler we do not abort. Maybe we should, but it is
- only asynchronous cancellation which is affected. */
-#ifndef SHARED
- extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
- __attribute__ ((weak));
- if (__nptl_sigcancel_handler != NULL)
-#endif
- {
- sa.sa_sigaction = __nptl_sigcancel_handler;
- sa.sa_flags = SA_SIGINFO;
- (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
- }
-
/* Install the handle to change the threads' uid/gid. */
sa.sa_sigaction = __nptl_setxid_sighandler;
sa.sa_flags = SA_SIGINFO | SA_RESTART;
--
2.30.2
next prev parent reply other threads:[~2021-05-26 16:57 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-26 16:57 [PATCH 00/11] nptl: pthread cancellation refactor Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 01/11] nptl: Move Linux createthread to nptl Adhemerval Zanella
2021-05-26 17:14 ` Florian Weimer
2021-05-26 16:57 ` [PATCH 02/11] nptl: Move createthread to pthread_create Adhemerval Zanella
2021-05-26 17:16 ` Florian Weimer
2021-05-26 17:29 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 03/11] support: Add xpthread_attr_setaffinity_np wrapper Adhemerval Zanella
2021-05-26 17:17 ` Florian Weimer
2021-05-27 22:35 ` Joseph Myers
2021-05-28 1:08 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 04/11] nptl: Add pthread_attr_setaffinity_np failure test Adhemerval Zanella
2021-05-26 17:21 ` Florian Weimer
2021-05-26 17:30 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 05/11] nptl: Deallocate the thread stack on setup failure (BZ #19511) Adhemerval Zanella
2021-05-26 17:33 ` Florian Weimer
2021-05-26 17:51 ` Adhemerval Zanella
2021-05-26 17:58 ` Florian Weimer
2021-05-26 19:19 ` Adhemerval Zanella
2021-05-26 18:21 ` Andreas Schwab
2021-05-26 18:40 ` Adhemerval Zanella
2021-05-26 19:26 ` Adhemerval Zanella
2021-05-27 7:43 ` Florian Weimer
2021-05-26 16:57 ` Adhemerval Zanella [this message]
2021-05-26 17:38 ` [PATCH 06/11] nptl: Install cancellation handler on pthread_cancel Florian Weimer
2021-05-26 17:52 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 07/11] nptl: Remove CANCELING_BITMASK Adhemerval Zanella
2021-05-26 18:02 ` Florian Weimer
2021-06-15 22:07 ` Florian Weimer
2021-06-15 23:33 ` Adhemerval Zanella
2021-06-16 12:46 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 08/11] nptl: Move cancel state out of cancelhandling Adhemerval Zanella
2021-05-26 18:20 ` Florian Weimer
2021-05-27 16:40 ` Adhemerval Zanella
2021-05-27 16:48 ` Florian Weimer
2021-05-27 16:57 ` Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 09/11] nptl: Move cancel type " Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 10/11] nptl: Implement raise in terms of pthread_kill Adhemerval Zanella
2021-05-26 16:57 ` [PATCH 11/11] nptl: Use pthread_kill on pthread_cancel Adhemerval Zanella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210526165728.1772546-7-adhemerval.zanella@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).