[COMMITTED] NPTL: Conditionalize more uses of SIGCANCEL and SIGSETXID.

Message ID 20141017205011.3A2662C2452@topped-with-meat.com
State Committed

Commit Message

Roland McGrath Oct. 17, 2014, 8:50 p.m. UTC
  This has no material effect on Linux configurations.


	* 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)
 static void
 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)
 /* 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;
 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);
 /* 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);
   /* 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)
   /* 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);
   /* This is where the try/finally block should be created.  For
      compilers without that support we do use setjmp.  */