Skip to content

Commit

Permalink
signal: cleanup sys_sigprocmask()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oleg Nesterov committed Apr 28, 2011
1 parent 702a507 commit b013c39
Showing 1 changed file with 16 additions and 21 deletions.
37 changes: 16 additions & 21 deletions kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 */

Expand Down

0 comments on commit b013c39

Please sign in to comment.