summaryrefslogtreecommitdiff
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2011-04-28 11:36:20 +0200
committerOleg Nesterov <oleg@redhat.com>2011-04-28 13:01:40 +0200
commitb013c399245a88a73aaa031279f0c4d7cea7fe68 (patch)
treea008708eee3d659e4f416fdf56894d572ae798b8 /kernel/signal.c
parent702a5073fdb71eb29cd4912575289fb5044c1894 (diff)
signal: cleanup sys_sigprocmask()
Cleanup. Remove the unneeded goto's, we can simply read blocked.sig[0] unconditionally and then copy-to-user it if oset != NULL. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Tejun Heo <tj@kernel.org> Reviewed-by: Matt Fleming <matt.fleming@linux.intel.com>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index e7ee4e642c5a..c0af959b8530 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2889,29 +2889,28 @@ SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set)
/**
* sys_sigprocmask - examine and change blocked signals
* @how: whether to add, remove, or set signals
- * @set: signals to add or remove (if non-null)
+ * @nset: signals to add or remove (if non-null)
* @oset: previous value of signal mask if non-null
*
* Some platforms have their own version with special arguments;
* others support only sys_rt_sigprocmask.
*/
-SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, set,
+SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset,
old_sigset_t __user *, oset)
{
- int error;
old_sigset_t old_set, new_set;
+ int error;
- if (set) {
- error = -EFAULT;
- if (copy_from_user(&new_set, set, sizeof(*set)))
- goto out;
- new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP));
+ old_set = current->blocked.sig[0];
- spin_lock_irq(&current->sighand->siglock);
- old_set = current->blocked.sig[0];
+ if (nset) {
+ if (copy_from_user(&new_set, nset, sizeof(*nset)))
+ return -EFAULT;
+ new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP));
error = 0;
+ spin_lock_irq(&current->sighand->siglock);
switch (how) {
default:
error = -EINVAL;
@@ -2930,19 +2929,15 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, set,
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
if (error)
- goto out;
- if (oset)
- goto set_old;
- } else if (oset) {
- old_set = current->blocked.sig[0];
- set_old:
- error = -EFAULT;
+ return error;
+ }
+
+ if (oset) {
if (copy_to_user(oset, &old_set, sizeof(*oset)))
- goto out;
+ return -EFAULT;
}
- error = 0;
-out:
- return error;
+
+ return 0;
}
#endif /* __ARCH_WANT_SYS_SIGPROCMASK */