]> sourceware.org Git - glibc.git/commitdiff
NPTL: Conditionalize more uses of SIGCANCEL and SIGSETXID.
authorRoland McGrath <roland@hack.frob.com>
Fri, 17 Oct 2014 20:40:46 +0000 (13:40 -0700)
committerRoland McGrath <roland@hack.frob.com>
Fri, 17 Oct 2014 20:40:46 +0000 (13:40 -0700)
ChangeLog
nptl/allocatestack.c
nptl/nptl-init.c
nptl/pthread_create.c

index 502bd421367a9bad7d7ee12c769a5331c5a3e2a3..51f07f85175e7324f780a4bac95be13b585a5041 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2014-10-17  Roland McGrath  <roland@hack.frob.com>
 
+       * 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].
+
        * nptl/nptl-init.c (__nptl_set_robust): Conditionalize body on
        [__NR_set_robust_list].
 
index d95ffe9d3621a621ba685e91096d4163818319e4..b19d9b3e95ac15dca5b2f63187c66370c7cc9229 100644 (file)
@@ -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)
index 44223a7a4140857fa88eb4d49ab47446c317fb1f..d8154c4101049c1436178bdf0b4fcbed6d32b099 100644 (file)
@@ -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.  */
index b9af01076794cb3daf5e737466bff94b79c32ffc..0055634cd3706fffa60e9181845368f9c6aa3b4c 100644 (file)
@@ -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.  */
This page took 0.124365 seconds and 5 git commands to generate.