diff options
-rw-r--r-- | kernel/signal.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 2584f5a91fbe..d523da02dd14 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -58,21 +58,20 @@ static int sig_handler_ignored(void __user *handler, int sig) | |||
58 | (handler == SIG_DFL && sig_kernel_ignore(sig)); | 58 | (handler == SIG_DFL && sig_kernel_ignore(sig)); |
59 | } | 59 | } |
60 | 60 | ||
61 | static int sig_task_ignored(struct task_struct *t, int sig, | 61 | static int sig_task_ignored(struct task_struct *t, int sig, bool force) |
62 | int from_ancestor_ns) | ||
63 | { | 62 | { |
64 | void __user *handler; | 63 | void __user *handler; |
65 | 64 | ||
66 | handler = sig_handler(t, sig); | 65 | handler = sig_handler(t, sig); |
67 | 66 | ||
68 | if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) && | 67 | if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) && |
69 | handler == SIG_DFL && !from_ancestor_ns) | 68 | handler == SIG_DFL && !force) |
70 | return 1; | 69 | return 1; |
71 | 70 | ||
72 | return sig_handler_ignored(handler, sig); | 71 | return sig_handler_ignored(handler, sig); |
73 | } | 72 | } |
74 | 73 | ||
75 | static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns) | 74 | static int sig_ignored(struct task_struct *t, int sig, bool force) |
76 | { | 75 | { |
77 | /* | 76 | /* |
78 | * Blocked signals are never ignored, since the | 77 | * Blocked signals are never ignored, since the |
@@ -82,7 +81,7 @@ static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns) | |||
82 | if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig)) | 81 | if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig)) |
83 | return 0; | 82 | return 0; |
84 | 83 | ||
85 | if (!sig_task_ignored(t, sig, from_ancestor_ns)) | 84 | if (!sig_task_ignored(t, sig, force)) |
86 | return 0; | 85 | return 0; |
87 | 86 | ||
88 | /* | 87 | /* |
@@ -855,7 +854,7 @@ static void ptrace_trap_notify(struct task_struct *t) | |||
855 | * Returns true if the signal should be actually delivered, otherwise | 854 | * Returns true if the signal should be actually delivered, otherwise |
856 | * it should be dropped. | 855 | * it should be dropped. |
857 | */ | 856 | */ |
858 | static int prepare_signal(int sig, struct task_struct *p, int from_ancestor_ns) | 857 | static int prepare_signal(int sig, struct task_struct *p, bool force) |
859 | { | 858 | { |
860 | struct signal_struct *signal = p->signal; | 859 | struct signal_struct *signal = p->signal; |
861 | struct task_struct *t; | 860 | struct task_struct *t; |
@@ -915,7 +914,7 @@ static int prepare_signal(int sig, struct task_struct *p, int from_ancestor_ns) | |||
915 | } | 914 | } |
916 | } | 915 | } |
917 | 916 | ||
918 | return !sig_ignored(p, sig, from_ancestor_ns); | 917 | return !sig_ignored(p, sig, force); |
919 | } | 918 | } |
920 | 919 | ||
921 | /* | 920 | /* |
@@ -1602,7 +1601,7 @@ int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group) | |||
1602 | 1601 | ||
1603 | ret = 1; /* the signal is ignored */ | 1602 | ret = 1; /* the signal is ignored */ |
1604 | result = TRACE_SIGNAL_IGNORED; | 1603 | result = TRACE_SIGNAL_IGNORED; |
1605 | if (!prepare_signal(sig, t, 0)) | 1604 | if (!prepare_signal(sig, t, false)) |
1606 | goto out; | 1605 | goto out; |
1607 | 1606 | ||
1608 | ret = 0; | 1607 | ret = 0; |