diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2006-02-09 14:41:50 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-09 19:17:36 -0500 |
commit | 9ac95f2f90e022c16d293d7978faddf7e779a1a9 (patch) | |
tree | dcc1769ed614585e956c20c718506cdfe4b0bf92 | |
parent | c70d3d703ad94727dab2a3664aeee33d71e00715 (diff) |
[PATCH] do_sigaction: cleanup ->sa_mask manipulation
Clear unblockable signals beforehand.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | include/linux/sched.h | 2 | ||||
-rw-r--r-- | kernel/signal.c | 8 |
2 files changed, 4 insertions, 6 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 0cfcd1c7865e..9c1da0269a18 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1098,7 +1098,7 @@ extern struct sigqueue *sigqueue_alloc(void); | |||
1098 | extern void sigqueue_free(struct sigqueue *); | 1098 | extern void sigqueue_free(struct sigqueue *); |
1099 | extern int send_sigqueue(int, struct sigqueue *, struct task_struct *); | 1099 | extern int send_sigqueue(int, struct sigqueue *, struct task_struct *); |
1100 | extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *); | 1100 | extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *); |
1101 | extern int do_sigaction(int, const struct k_sigaction *, struct k_sigaction *); | 1101 | extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); |
1102 | extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); | 1102 | extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); |
1103 | 1103 | ||
1104 | /* These can be the second arg to send_sig_info/send_group_sig_info. */ | 1104 | /* These can be the second arg to send_sig_info/send_group_sig_info. */ |
diff --git a/kernel/signal.c b/kernel/signal.c index 01a1e7f7acf7..ea154104a00b 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -2430,7 +2430,7 @@ sys_rt_sigqueueinfo(int pid, int sig, siginfo_t __user *uinfo) | |||
2430 | } | 2430 | } |
2431 | 2431 | ||
2432 | int | 2432 | int |
2433 | do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) | 2433 | do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) |
2434 | { | 2434 | { |
2435 | struct k_sigaction *k; | 2435 | struct k_sigaction *k; |
2436 | sigset_t mask; | 2436 | sigset_t mask; |
@@ -2454,6 +2454,8 @@ do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) | |||
2454 | *oact = *k; | 2454 | *oact = *k; |
2455 | 2455 | ||
2456 | if (act) { | 2456 | if (act) { |
2457 | sigdelsetmask(&act->sa.sa_mask, | ||
2458 | sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
2457 | /* | 2459 | /* |
2458 | * POSIX 3.3.1.3: | 2460 | * POSIX 3.3.1.3: |
2459 | * "Setting a signal action to SIG_IGN for a signal that is | 2461 | * "Setting a signal action to SIG_IGN for a signal that is |
@@ -2479,8 +2481,6 @@ do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) | |||
2479 | read_lock(&tasklist_lock); | 2481 | read_lock(&tasklist_lock); |
2480 | spin_lock_irq(&t->sighand->siglock); | 2482 | spin_lock_irq(&t->sighand->siglock); |
2481 | *k = *act; | 2483 | *k = *act; |
2482 | sigdelsetmask(&k->sa.sa_mask, | ||
2483 | sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
2484 | sigemptyset(&mask); | 2484 | sigemptyset(&mask); |
2485 | sigaddset(&mask, sig); | 2485 | sigaddset(&mask, sig); |
2486 | rm_from_queue_full(&mask, &t->signal->shared_pending); | 2486 | rm_from_queue_full(&mask, &t->signal->shared_pending); |
@@ -2495,8 +2495,6 @@ do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) | |||
2495 | } | 2495 | } |
2496 | 2496 | ||
2497 | *k = *act; | 2497 | *k = *act; |
2498 | sigdelsetmask(&k->sa.sa_mask, | ||
2499 | sigmask(SIGKILL) | sigmask(SIGSTOP)); | ||
2500 | } | 2498 | } |
2501 | 2499 | ||
2502 | spin_unlock_irq(¤t->sighand->siglock); | 2500 | spin_unlock_irq(¤t->sighand->siglock); |