aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2014-10-17 13:40:46 -0700
committerRoland McGrath <roland@hack.frob.com>2014-10-17 13:40:46 -0700
commit327ae2570744dabf7f065a6b529d16cc22438603 (patch)
tree1ceb494203f9a8c6419d6f76d9ad155951646ea1
parentb0643088bc7387e04cf53dcf7331d02f7fa62c72 (diff)
downloadglibc-327ae2570744dabf7f065a6b529d16cc22438603.zip
glibc-327ae2570744dabf7f065a6b529d16cc22438603.tar.gz
glibc-327ae2570744dabf7f065a6b529d16cc22438603.tar.bz2
NPTL: Conditionalize more uses of SIGCANCEL and SIGSETXID.
-rw-r--r--ChangeLog11
-rw-r--r--nptl/allocatestack.c3
-rw-r--r--nptl/nptl-init.c21
-rw-r--r--nptl/pthread_create.c2
4 files changed, 33 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 502bd42..51f07f8 100644
--- 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].
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index d95ffe9..b19d9b3 100644
--- 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)
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index 44223a7..d8154c4 100644
--- 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. */
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index b9af010..0055634 100644
--- 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. */