From patchwork Fri Oct 17 20:50:11 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 3277 Received: (qmail 19241 invoked by alias); 17 Oct 2014 20:50:14 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 19228 invoked by uid 89); 17 Oct 2014 20:50:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "GNU C. Library" Subject: [COMMITTED PATCH] NPTL: Conditionalize more uses of SIGCANCEL and SIGSETXID. Message-Id: <20141017205011.3A2662C2452@topped-with-meat.com> Date: Fri, 17 Oct 2014 13:50:11 -0700 (PDT) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=Z6MIti7PxpgA:10 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=y2Gdh5-Q-D_u_M-DR-cA:9 a=CjuIK1q_8ugA:10 This has no material effect on Linux configurations. Thanks, Roland * nptl/nptl-init.c (sighandler_setxid, __xidcmd): Make definitions conditional on [SIGSETXID]. (sigcancel_handler): Make definition conditional on [SIGCANCEL]. (__pthread_initialize_minimal_internal): Set up SIGCANCEL only if it is defined. Likewise for SIGSETXID. * nptl/allocatestack.c (setxid_mark_thread, setxid_unmark_thread): Conditionalize definitions on [SIGSETXID]. (setxid_signal_thread, __nptl_setxid_error, __nptl_setxid): Likewise. * nptl/pthread_create.c (start_thread): Conditionalize SIGCANCEL unblocking on [SIGCANCEL]. --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -978,6 +978,7 @@ __find_thread_by_id (pid_t tid) #endif +#ifdef SIGSETXID static void internal_function setxid_mark_thread (struct xid_command *cmdp, struct pthread *t) @@ -1185,6 +1186,8 @@ __nptl_setxid (struct xid_command *cmdp) lll_unlock (stack_cache_lock, LLL_PRIVATE); return result; } +#endif /* SIGSETXID. */ + static inline void __attribute__((always_inline)) init_one_static_tls (struct pthread *curp, struct link_map *map) --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -170,6 +170,7 @@ __nptl_set_robust (struct pthread *self) } +#ifdef SIGCANCEL /* For asynchronous cancellation we use a signal. This is the handler. */ static void sigcancel_handler (int sig, siginfo_t *si, void *ctx) @@ -221,8 +222,10 @@ sigcancel_handler (int sig, siginfo_t *si, void *ctx) oldval = curval; } } +#endif +#ifdef SIGSETXID struct xid_command *__xidcmd attribute_hidden; /* We use the SIGSETXID signal in the setuid, setgid, etc. implementations to @@ -273,6 +276,7 @@ sighandler_setxid (int sig, siginfo_t *si, void *ctx) if (atomic_decrement_val (&__xidcmd->cntr) == 0) lll_futex_wake (&__xidcmd->cntr, 1, LLL_PRIVATE); } +#endif /* When using __thread for this, we do it in libc so as not @@ -372,29 +376,38 @@ __pthread_initialize_minimal_internal (void) had to set __nptl_initial_report_events. Propagate its setting. */ THREAD_SETMEM (pd, report_events, __nptl_initial_report_events); +#if defined SIGCANCEL || defined SIGSETXID + struct sigaction sa; + __sigemptyset (&sa.sa_mask); + +# ifdef SIGCANCEL /* Install the cancellation signal handler. 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. */ - struct sigaction sa; sa.sa_sigaction = sigcancel_handler; sa.sa_flags = SA_SIGINFO; - __sigemptyset (&sa.sa_mask); - (void) __libc_sigaction (SIGCANCEL, &sa, NULL); +# endif +# ifdef SIGSETXID /* Install the handle to change the threads' uid/gid. */ sa.sa_sigaction = sighandler_setxid; sa.sa_flags = SA_SIGINFO | SA_RESTART; - (void) __libc_sigaction (SIGSETXID, &sa, NULL); +# endif /* The parent process might have left the signals blocked. Just in case, unblock it. We reuse the signal mask in the sigaction structure. It is already cleared. */ +# ifdef SIGCANCEL __sigaddset (&sa.sa_mask, SIGCANCEL); +# endif +# ifdef SIGSETXID __sigaddset (&sa.sa_mask, SIGSETXID); +# endif (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &sa.sa_mask, NULL, _NSIG / 8); +#endif /* Get the size of the static and alignment requirements for the TLS block. */ --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -263,6 +263,7 @@ start_thread (void *arg) } #endif +#ifdef SIGCANCEL /* If the parent was running cancellation handlers while creating the thread the new thread inherited the signal mask. Reset the cancellation signal mask. */ @@ -275,6 +276,7 @@ start_thread (void *arg) (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &mask, NULL, _NSIG / 8); } +#endif /* This is where the try/finally block should be created. For compilers without that support we do use setjmp. */