struct task_struct *t;
if (signal->flags & (SIGNAL_GROUP_EXIT | SIGNAL_GROUP_COREDUMP)) {
- if (signal->flags & SIGNAL_GROUP_COREDUMP)
- return sig == SIGKILL;
+ if (signal->flags & SIGNAL_GROUP_COREDUMP) {
+ printk(KERN_DEBUG "[%d:%s] is in the middle of dying so skip sig %d\n",p->pid, p->comm, sig);
+ }
+ return 0;
/*
* The process is in the middle of dying, nothing to do.
*/
}
#endif
+static const char stat_nam[] = TASK_STATE_TO_CHAR_STR;
+
static int __send_signal(int sig, struct siginfo *info, struct task_struct *t,
int group, int from_ancestor_ns)
{
struct sigqueue *q;
int override_rlimit;
int ret = 0, result;
+ unsigned state;
+ state = t->state ? __ffs(t->state) + 1 : 0;
+ printk(KERN_DEBUG "[%d:%s] sig %d to [%d:%s] stat=%c\n",
+ current->pid, current->comm, sig, t->pid, t->comm,
+ state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?');
assert_spin_locked(&t->sighand->siglock);
result = TRACE_SIGNAL_IGNORED;
* Other callers might not initialize the si_lsb field,
* so check explicitly for the right codes here.
*/
- if (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)
+ if (from->si_signo == SIGBUS &&
+ (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO))
err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
#endif
break;
recalc_sigpending();
spin_unlock_irq(&tsk->sighand->siglock);
- timeout = schedule_timeout_interruptible(timeout);
+ timeout = freezable_schedule_timeout_interruptible(timeout);
spin_lock_irq(&tsk->sighand->siglock);
__set_task_blocked(tsk, &tsk->real_blocked);
int, sig,
struct compat_siginfo __user *, uinfo)
{
- siginfo_t info;
+ siginfo_t info = {};
int ret = copy_siginfo_from_user32(&info, uinfo);
if (unlikely(ret))
return ret;
int, sig,
struct compat_siginfo __user *, uinfo)
{
- siginfo_t info;
+ siginfo_t info = {};
if (copy_siginfo_from_user32(&info, uinfo))
return -EFAULT;