Attempt to handle systems with SA_SIGINFO but that lack SI_USER.

This commit is contained in:
Todd C. Miller
2014-07-28 20:25:46 -06:00
parent 99ae71452a
commit ae0014d6f4
3 changed files with 14 additions and 3 deletions

View File

@@ -870,7 +870,7 @@ handler(int s, siginfo_t *info, void *context)
* kill itself. For example, this can happen with some versions of * kill itself. For example, this can happen with some versions of
* reboot that call kill(-1, SIGTERM) to kill all other processes. * reboot that call kill(-1, SIGTERM) to kill all other processes.
*/ */
if (info != NULL && info->si_code == SI_USER) { if (USER_SIGNALED(info)) {
pid_t si_pgrp = getpgid(info->si_pid); pid_t si_pgrp = getpgid(info->si_pid);
if (si_pgrp != (pid_t)-1) { if (si_pgrp != (pid_t)-1) {
if (si_pgrp == ppgrp || si_pgrp == cmnd_pid) if (si_pgrp == ppgrp || si_pgrp == cmnd_pid)
@@ -926,7 +926,7 @@ handler_user_only(int s, siginfo_t *info, void *context)
* often trap ^Z and send SIGTSTP to their own pgrp, so we don't * often trap ^Z and send SIGTSTP to their own pgrp, so we don't
* want to send an extra SIGTSTP. * want to send an extra SIGTSTP.
*/ */
if (info == NULL || info->si_code != SI_USER) if (!USER_SIGNALED(info))
return; return;
if ((si_pgrp = getpgid(info->si_pid)) != (pid_t)-1) { if ((si_pgrp = getpgid(info->si_pid)) != (pid_t)-1) {
if (si_pgrp == ppgrp || si_pgrp == cmnd_pid) if (si_pgrp == ppgrp || si_pgrp == cmnd_pid)

View File

@@ -141,7 +141,7 @@ mon_handler(int s, siginfo_t *info, void *context)
* itself. This can happen with, e.g., BSD-derived versions of * itself. This can happen with, e.g., BSD-derived versions of
* reboot that call kill(-1, SIGTERM) to kill all other processes. * reboot that call kill(-1, SIGTERM) to kill all other processes.
*/ */
if (info != NULL && info->si_code == SI_USER) { if (USER_SIGNALED(info)) {
pid_t si_pgrp = getpgid(info->si_pid); pid_t si_pgrp = getpgid(info->si_pid);
if (si_pgrp != (pid_t)-1) { if (si_pgrp != (pid_t)-1) {
if (si_pgrp == cmnd_pgrp) if (si_pgrp == cmnd_pgrp)

View File

@@ -24,6 +24,17 @@
# define MSG_WAITALL 0 # define MSG_WAITALL 0
#endif #endif
/*
* Some older systems support siginfo but predate SI_USER.
*/
#ifdef SA_SIGINFO
# ifdef SI_USER
# define USER_SIGNALED(_info) ((_info) != NULL && (_info)->si_code == SI_USER)
# else
# define USER_SIGNALED(_info) ((_info) != NULL && (_info)->si_code <= 0)
# endif
#endif
/* /*
* Special values to indicate whether continuing in foreground or background. * Special values to indicate whether continuing in foreground or background.
*/ */