Rip out get_signal_to_deliver()
Now we can turn get_signal() to the main function. Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
10b1c7ac8b
commit
828b1f65d2
@ -280,7 +280,7 @@ struct ksignal {
|
|||||||
int sig;
|
int sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
|
extern int get_signal(struct ksignal *ksig);
|
||||||
extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
|
extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
|
||||||
extern void exit_signals(struct task_struct *tsk);
|
extern void exit_signals(struct task_struct *tsk);
|
||||||
extern void kernel_sigaction(int, __sighandler_t);
|
extern void kernel_sigaction(int, __sighandler_t);
|
||||||
@ -300,18 +300,6 @@ static inline void disallow_signal(int sig)
|
|||||||
kernel_sigaction(sig, SIG_IGN);
|
kernel_sigaction(sig, SIG_IGN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Eventually that'll replace get_signal_to_deliver(); macro for now,
|
|
||||||
* to avoid nastiness with include order.
|
|
||||||
*/
|
|
||||||
#define get_signal(ksig) \
|
|
||||||
({ \
|
|
||||||
struct ksignal *p = (ksig); \
|
|
||||||
p->sig = get_signal_to_deliver(&p->info, &p->ka, \
|
|
||||||
signal_pt_regs(), NULL);\
|
|
||||||
p->sig > 0; \
|
|
||||||
})
|
|
||||||
|
|
||||||
extern struct kmem_cache *sighand_cachep;
|
extern struct kmem_cache *sighand_cachep;
|
||||||
|
|
||||||
int unhandled_signal(struct task_struct *tsk, int sig);
|
int unhandled_signal(struct task_struct *tsk, int sig);
|
||||||
|
@ -2166,8 +2166,7 @@ static int ptrace_signal(int signr, siginfo_t *info)
|
|||||||
return signr;
|
return signr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
|
int get_signal(struct ksignal *ksig)
|
||||||
struct pt_regs *regs, void *cookie)
|
|
||||||
{
|
{
|
||||||
struct sighand_struct *sighand = current->sighand;
|
struct sighand_struct *sighand = current->sighand;
|
||||||
struct signal_struct *signal = current->signal;
|
struct signal_struct *signal = current->signal;
|
||||||
@ -2237,13 +2236,13 @@ relock:
|
|||||||
goto relock;
|
goto relock;
|
||||||
}
|
}
|
||||||
|
|
||||||
signr = dequeue_signal(current, ¤t->blocked, info);
|
signr = dequeue_signal(current, ¤t->blocked, &ksig->info);
|
||||||
|
|
||||||
if (!signr)
|
if (!signr)
|
||||||
break; /* will return 0 */
|
break; /* will return 0 */
|
||||||
|
|
||||||
if (unlikely(current->ptrace) && signr != SIGKILL) {
|
if (unlikely(current->ptrace) && signr != SIGKILL) {
|
||||||
signr = ptrace_signal(signr, info);
|
signr = ptrace_signal(signr, &ksig->info);
|
||||||
if (!signr)
|
if (!signr)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -2251,13 +2250,13 @@ relock:
|
|||||||
ka = &sighand->action[signr-1];
|
ka = &sighand->action[signr-1];
|
||||||
|
|
||||||
/* Trace actually delivered signals. */
|
/* Trace actually delivered signals. */
|
||||||
trace_signal_deliver(signr, info, ka);
|
trace_signal_deliver(signr, &ksig->info, ka);
|
||||||
|
|
||||||
if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
|
if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
|
||||||
continue;
|
continue;
|
||||||
if (ka->sa.sa_handler != SIG_DFL) {
|
if (ka->sa.sa_handler != SIG_DFL) {
|
||||||
/* Run the handler. */
|
/* Run the handler. */
|
||||||
*return_ka = *ka;
|
ksig->ka = *ka;
|
||||||
|
|
||||||
if (ka->sa.sa_flags & SA_ONESHOT)
|
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||||
ka->sa.sa_handler = SIG_DFL;
|
ka->sa.sa_handler = SIG_DFL;
|
||||||
@ -2307,7 +2306,7 @@ relock:
|
|||||||
spin_lock_irq(&sighand->siglock);
|
spin_lock_irq(&sighand->siglock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (likely(do_signal_stop(info->si_signo))) {
|
if (likely(do_signal_stop(ksig->info.si_signo))) {
|
||||||
/* It released the siglock. */
|
/* It released the siglock. */
|
||||||
goto relock;
|
goto relock;
|
||||||
}
|
}
|
||||||
@ -2328,7 +2327,7 @@ relock:
|
|||||||
|
|
||||||
if (sig_kernel_coredump(signr)) {
|
if (sig_kernel_coredump(signr)) {
|
||||||
if (print_fatal_signals)
|
if (print_fatal_signals)
|
||||||
print_fatal_signal(info->si_signo);
|
print_fatal_signal(ksig->info.si_signo);
|
||||||
proc_coredump_connector(current);
|
proc_coredump_connector(current);
|
||||||
/*
|
/*
|
||||||
* If it was able to dump core, this kills all
|
* If it was able to dump core, this kills all
|
||||||
@ -2338,17 +2337,19 @@ relock:
|
|||||||
* first and our do_group_exit call below will use
|
* first and our do_group_exit call below will use
|
||||||
* that value and ignore the one we pass it.
|
* that value and ignore the one we pass it.
|
||||||
*/
|
*/
|
||||||
do_coredump(info);
|
do_coredump(&ksig->info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Death signals, no core dump.
|
* Death signals, no core dump.
|
||||||
*/
|
*/
|
||||||
do_group_exit(info->si_signo);
|
do_group_exit(ksig->info.si_signo);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&sighand->siglock);
|
spin_unlock_irq(&sighand->siglock);
|
||||||
return signr;
|
|
||||||
|
ksig->sig = signr;
|
||||||
|
return ksig->sig > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user