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:
11
ChangeLog
11
ChangeLog
@ -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].
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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. */
|
||||||
|
@ -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. */
|
||||||
|
Reference in New Issue
Block a user