From 53876ab402e2d1f566c052ab1be45680f2f69949 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 23 Feb 2003 17:40:38 -0800 Subject: [PATCH] Add support for forcing default signal handlers to flush_signal_handlers(). Make kmod force default handlers before executing the user process. --- fs/exec.c | 2 +- include/linux/sched.h | 2 +- kernel/kmod.c | 2 +- kernel/signal.c | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index a3fbd7c8aa5f2..061f96130173d 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -821,7 +821,7 @@ int flush_old_exec(struct linux_binprm * bprm) current->self_exec_id++; - flush_signal_handlers(current); + flush_signal_handlers(current, 0); flush_old_files(current->files); exit_itimers(current); diff --git a/include/linux/sched.h b/include/linux/sched.h index c3fc6fc5ed9ab..0b325d2820011 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -534,7 +534,7 @@ extern int in_egroup_p(gid_t); extern void proc_caches_init(void); extern void flush_signals(struct task_struct *); -extern void flush_signal_handlers(struct task_struct *); +extern void flush_signal_handlers(struct task_struct *, int force_default); extern int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info); extern void block_all_signals(int (*notifier)(void *priv), void *priv, sigset_t *mask); diff --git a/kernel/kmod.c b/kernel/kmod.c index 01c18cacc58b4..971fc7438a6b9 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -155,7 +155,7 @@ static int ____call_usermodehelper(void *data) /* Unblock all signals. */ flush_signals(current); spin_lock_irq(¤t->sighand->siglock); - flush_signal_handlers(current); + flush_signal_handlers(current, 1); sigemptyset(¤t->blocked); recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); diff --git a/kernel/signal.c b/kernel/signal.c index 0f64a3867736e..49e483f8451e1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -356,12 +356,12 @@ void exit_signal(struct task_struct *tsk) */ void -flush_signal_handlers(struct task_struct *t) +flush_signal_handlers(struct task_struct *t, int force_default) { int i; struct k_sigaction *ka = &t->sighand->action[0]; for (i = _NSIG ; i != 0 ; i--) { - if (ka->sa.sa_handler != SIG_IGN) + if (force_default || ka->sa.sa_handler != SIG_IGN) ka->sa.sa_handler = SIG_DFL; ka->sa.sa_flags = 0; sigemptyset(&ka->sa.sa_mask); -- 2.53.0