aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-04-27 13:58:59 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-06-01 12:58:51 -0400
commit77097ae503b170120ab66dd1d547f8577193f91f (patch)
treebee5b2e8d91b9ec8ab74c58cbec1796c7bacc2e5 /kernel/signal.c
parentedd63a2763bdae0daa4f0a4d4c5d61d1154352a5 (diff)
most of set_current_blocked() callers want SIGKILL/SIGSTOP removed from set
Only 3 out of 63 do not. Renamed the current variant to __set_current_blocked(), added set_current_blocked() that will exclude unblockable signals, switched open-coded instances to it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index b9be7e0fe41a..df8d721a9e6f 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2524,7 +2524,16 @@ static void __set_task_blocked(struct task_struct *tsk, const sigset_t *newset)
2524 * It is wrong to change ->blocked directly, this helper should be used 2524 * It is wrong to change ->blocked directly, this helper should be used
2525 * to ensure the process can't miss a shared signal we are going to block. 2525 * to ensure the process can't miss a shared signal we are going to block.
2526 */ 2526 */
2527void set_current_blocked(const sigset_t *newset) 2527void set_current_blocked(sigset_t *newset)
2528{
2529 struct task_struct *tsk = current;
2530 sigdelsetmask(newset, sigmask(SIGKILL) | sigmask(SIGSTOP));
2531 spin_lock_irq(&tsk->sighand->siglock);
2532 __set_task_blocked(tsk, newset);
2533 spin_unlock_irq(&tsk->sighand->siglock);
2534}
2535
2536void __set_current_blocked(const sigset_t *newset)
2528{ 2537{
2529 struct task_struct *tsk = current; 2538 struct task_struct *tsk = current;
2530 2539
@@ -2564,7 +2573,7 @@ int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
2564 return -EINVAL; 2573 return -EINVAL;
2565 } 2574 }
2566 2575
2567 set_current_blocked(&newset); 2576 __set_current_blocked(&newset);
2568 return 0; 2577 return 0;
2569} 2578}
2570 2579
@@ -3138,7 +3147,7 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset,
3138 return -EINVAL; 3147 return -EINVAL;
3139 } 3148 }
3140 3149
3141 set_current_blocked(&new_blocked); 3150 __set_current_blocked(&new_blocked);
3142 } 3151 }
3143 3152
3144 if (oset) { 3153 if (oset) {
@@ -3202,7 +3211,6 @@ SYSCALL_DEFINE1(ssetmask, int, newmask)
3202 int old = current->blocked.sig[0]; 3211 int old = current->blocked.sig[0];
3203 sigset_t newset; 3212 sigset_t newset;
3204 3213
3205 siginitset(&newset, newmask & ~(sigmask(SIGKILL) | sigmask(SIGSTOP)));
3206 set_current_blocked(&newset); 3214 set_current_blocked(&newset);
3207 3215
3208 return old; 3216 return old;
@@ -3243,8 +3251,6 @@ SYSCALL_DEFINE0(pause)
3243 3251
3244int sigsuspend(sigset_t *set) 3252int sigsuspend(sigset_t *set)
3245{ 3253{
3246 sigdelsetmask(set, sigmask(SIGKILL)|sigmask(SIGSTOP));
3247
3248 current->saved_sigmask = current->blocked; 3254 current->saved_sigmask = current->blocked;
3249 set_current_blocked(set); 3255 set_current_blocked(set);
3250 3256