diff options
-rw-r--r-- | kernel/signal.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 1d8f84c5c6ee..1bf3c39d6109 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -879,11 +879,13 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) | |||
879 | int ret; | 879 | int ret; |
880 | 880 | ||
881 | spin_lock_irqsave(&t->sighand->siglock, flags); | 881 | spin_lock_irqsave(&t->sighand->siglock, flags); |
882 | if (sigismember(&t->blocked, sig) || t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) { | 882 | if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) { |
883 | t->sighand->action[sig-1].sa.sa_handler = SIG_DFL; | 883 | t->sighand->action[sig-1].sa.sa_handler = SIG_DFL; |
884 | } | ||
885 | if (sigismember(&t->blocked, sig)) { | ||
884 | sigdelset(&t->blocked, sig); | 886 | sigdelset(&t->blocked, sig); |
885 | recalc_sigpending_tsk(t); | ||
886 | } | 887 | } |
888 | recalc_sigpending_tsk(t); | ||
887 | ret = specific_send_sig_info(sig, info, t); | 889 | ret = specific_send_sig_info(sig, info, t); |
888 | spin_unlock_irqrestore(&t->sighand->siglock, flags); | 890 | spin_unlock_irqrestore(&t->sighand->siglock, flags); |
889 | 891 | ||
@@ -893,15 +895,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) | |||
893 | void | 895 | void |
894 | force_sig_specific(int sig, struct task_struct *t) | 896 | force_sig_specific(int sig, struct task_struct *t) |
895 | { | 897 | { |
896 | unsigned long int flags; | 898 | force_sig_info(sig, SEND_SIG_FORCED, t); |
897 | |||
898 | spin_lock_irqsave(&t->sighand->siglock, flags); | ||
899 | if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) | ||
900 | t->sighand->action[sig-1].sa.sa_handler = SIG_DFL; | ||
901 | sigdelset(&t->blocked, sig); | ||
902 | recalc_sigpending_tsk(t); | ||
903 | specific_send_sig_info(sig, SEND_SIG_FORCED, t); | ||
904 | spin_unlock_irqrestore(&t->sighand->siglock, flags); | ||
905 | } | 899 | } |
906 | 900 | ||
907 | /* | 901 | /* |