1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

NPTL: Conditionalize more uses of SIGCANCEL and SIGSETXID.

This commit is contained in:
Roland McGrath
2014-10-17 13:40:46 -07:00
parent b0643088bc
commit 327ae25707
4 changed files with 33 additions and 4 deletions

View File

@ -1,5 +1,16 @@
2014-10-17 Roland McGrath <roland@hack.frob.com> 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 * nptl/nptl-init.c (__nptl_set_robust): Conditionalize body on
[__NR_set_robust_list]. [__NR_set_robust_list].

View File

@ -978,6 +978,7 @@ __find_thread_by_id (pid_t tid)
#endif #endif
#ifdef SIGSETXID
static void static void
internal_function internal_function
setxid_mark_thread (struct xid_command *cmdp, struct pthread *t) 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); lll_unlock (stack_cache_lock, LLL_PRIVATE);
return result; return result;
} }
#endif /* SIGSETXID. */
static inline void __attribute__((always_inline)) static inline void __attribute__((always_inline))
init_one_static_tls (struct pthread *curp, struct link_map *map) init_one_static_tls (struct pthread *curp, struct link_map *map)

View File

@ -170,6 +170,7 @@ __nptl_set_robust (struct pthread *self)
} }
#ifdef SIGCANCEL
/* For asynchronous cancellation we use a signal. This is the handler. */ /* For asynchronous cancellation we use a signal. This is the handler. */
static void static void
sigcancel_handler (int sig, siginfo_t *si, void *ctx) sigcancel_handler (int sig, siginfo_t *si, void *ctx)
@ -221,8 +222,10 @@ sigcancel_handler (int sig, siginfo_t *si, void *ctx)
oldval = curval; oldval = curval;
} }
} }
#endif
#ifdef SIGSETXID
struct xid_command *__xidcmd attribute_hidden; struct xid_command *__xidcmd attribute_hidden;
/* We use the SIGSETXID signal in the setuid, setgid, etc. implementations to /* 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) if (atomic_decrement_val (&__xidcmd->cntr) == 0)
lll_futex_wake (&__xidcmd->cntr, 1, LLL_PRIVATE); lll_futex_wake (&__xidcmd->cntr, 1, LLL_PRIVATE);
} }
#endif
/* When using __thread for this, we do it in libc so as not /* 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. */ had to set __nptl_initial_report_events. Propagate its setting. */
THREAD_SETMEM (pd, report_events, __nptl_initial_report_events); 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 /* Install the cancellation signal handler. If for some reason we
cannot install the handler we do not abort. Maybe we should, but cannot install the handler we do not abort. Maybe we should, but
it is only asynchronous cancellation which is affected. */ it is only asynchronous cancellation which is affected. */
struct sigaction sa;
sa.sa_sigaction = sigcancel_handler; sa.sa_sigaction = sigcancel_handler;
sa.sa_flags = SA_SIGINFO; sa.sa_flags = SA_SIGINFO;
__sigemptyset (&sa.sa_mask);
(void) __libc_sigaction (SIGCANCEL, &sa, NULL); (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
# endif
# ifdef SIGSETXID
/* Install the handle to change the threads' uid/gid. */ /* Install the handle to change the threads' uid/gid. */
sa.sa_sigaction = sighandler_setxid; sa.sa_sigaction = sighandler_setxid;
sa.sa_flags = SA_SIGINFO | SA_RESTART; sa.sa_flags = SA_SIGINFO | SA_RESTART;
(void) __libc_sigaction (SIGSETXID, &sa, NULL); (void) __libc_sigaction (SIGSETXID, &sa, NULL);
# endif
/* The parent process might have left the signals blocked. Just in /* The parent process might have left the signals blocked. Just in
case, unblock it. We reuse the signal mask in the sigaction case, unblock it. We reuse the signal mask in the sigaction
structure. It is already cleared. */ structure. It is already cleared. */
# ifdef SIGCANCEL
__sigaddset (&sa.sa_mask, SIGCANCEL); __sigaddset (&sa.sa_mask, SIGCANCEL);
# endif
# ifdef SIGSETXID
__sigaddset (&sa.sa_mask, SIGSETXID); __sigaddset (&sa.sa_mask, SIGSETXID);
# endif
(void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &sa.sa_mask, (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &sa.sa_mask,
NULL, _NSIG / 8); NULL, _NSIG / 8);
#endif
/* Get the size of the static and alignment requirements for the TLS /* Get the size of the static and alignment requirements for the TLS
block. */ block. */

View File

@ -263,6 +263,7 @@ start_thread (void *arg)
} }
#endif #endif
#ifdef SIGCANCEL
/* If the parent was running cancellation handlers while creating /* If the parent was running cancellation handlers while creating
the thread the new thread inherited the signal mask. Reset the the thread the new thread inherited the signal mask. Reset the
cancellation signal mask. */ cancellation signal mask. */
@ -275,6 +276,7 @@ start_thread (void *arg)
(void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &mask, (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &mask,
NULL, _NSIG / 8); NULL, _NSIG / 8);
} }
#endif
/* This is where the try/finally block should be created. For /* This is where the try/finally block should be created. For
compilers without that support we do use setjmp. */ compilers without that support we do use setjmp. */