From patchwork Thu May 27 17:28:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 43610 X-Patchwork-Delegate: fweimer@redhat.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 000C73959CB5; Thu, 27 May 2021 17:28:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 000C73959CB5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1622136517; bh=1rDskCFxJOY6TQeexJoMdFMOBPZaft3uvIXkXagLwhA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=vZC3nN6+vj2GcFdZj1qUbzCvYmFUZE1TmfDzWR1VY70e7Fl95oNuGIyoXSkhXyqsG oWc8n43YgYZ+p1QQUKRnmUN/cAhs+FLnLGeT7NccQ8TZWF4NV0eR8BOVNx9mFb/pF2 SGFv+ZzLwHXPepV5l+iBslIIeULD+oSnGgCdSdgw= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by sourceware.org (Postfix) with ESMTPS id 5E9D43959CB3 for ; Thu, 27 May 2021 17:28:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5E9D43959CB3 Received: by mail-qt1-x82f.google.com with SMTP id m13so754060qtk.13 for ; Thu, 27 May 2021 10:28:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1rDskCFxJOY6TQeexJoMdFMOBPZaft3uvIXkXagLwhA=; b=dtwdiB0Ku37aVu+ADQs1q3QlNoS3CkPKsYVaUGGWu0IMZDGXm+USwf6KnG3Im8o/R5 nJ5Jj6+9/FzKchdsbow/Ivrvkb4pQi9Kfg6nDI+B+F74YS0skMOcNZ/E+AxGyJwuUwa5 M1IBSBkMT5N6Kd4TtpXxCaYkcVa0EMEKaiKcfbLaIAiClV6+x1rYweMEKFjUeQiFH3ul 7TpITyi+V+k3A5/BM0ktW5Zi1VV/n+lNXQD4GKbLklZRiaqVfvrbCqkNMDBikcCkA52z dBxD1sH4+pl9zt0LhPGMwNIPQZrUsRCAiKTzdFjYDkxZUMolrKrXhS0dJxopv7XDZLpW sAig== X-Gm-Message-State: AOAM5312v4yFSKyzanVI+IUpcBN79WzXzEiy9a9rtj2C3i3sjBdTVOTH HlPDgT/9NqYtLTFUq4maql3ksHDkEVuJhA== X-Google-Smtp-Source: ABdhPJx3igy44UBJqDbeRIJyej5maMgIITLs9NCaUeUN3qBwM8BVD7TOseABGOVOg8MN7tj/gYzN2Q== X-Received: by 2002:ac8:72d8:: with SMTP id o24mr4071686qtp.321.1622136511692; Thu, 27 May 2021 10:28:31 -0700 (PDT) Received: from birita.. ([177.194.37.86]) by smtp.googlemail.com with ESMTPSA id 25sm1767913qtd.51.2021.05.27.10.28.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 10:28:31 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v2 3/9] nptl: Install cancellation handler on pthread_cancel Date: Thu, 27 May 2021 14:28:17 -0300 Message-Id: <20210527172823.3461314-4-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210527172823.3461314-1-adhemerval.zanella@linaro.org> References: <20210527172823.3461314-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" 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..deb404600c 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -28,11 +28,19 @@ #include #include -/* 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 018af30c85..15ce5ad4a1 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -67,21 +67,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. Use SA_ONSTACK because the signal may be sent to threads that are running with custom stacks. (This is less likely for