aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-02-09 14:41:50 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-09 19:17:36 -0500
commit9ac95f2f90e022c16d293d7978faddf7e779a1a9 (patch)
treedcc1769ed614585e956c20c718506cdfe4b0bf92
parentc70d3d703ad94727dab2a3664aeee33d71e00715 (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.h2
-rw-r--r--kernel/signal.c8
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);
1098extern void sigqueue_free(struct sigqueue *); 1098extern void sigqueue_free(struct sigqueue *);
1099extern int send_sigqueue(int, struct sigqueue *, struct task_struct *); 1099extern int send_sigqueue(int, struct sigqueue *, struct task_struct *);
1100extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *); 1100extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *);
1101extern int do_sigaction(int, const struct k_sigaction *, struct k_sigaction *); 1101extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *);
1102extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); 1102extern 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
2432int 2432int
2433do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) 2433do_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(&current->sighand->siglock); 2500 spin_unlock_irq(&current->sighand->siglock);