mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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>
This commit is contained in:
parent
702a5073fd
commit
b013c39924
@ -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;
|
||||
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));
|
||||
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
old_set = current->blocked.sig[0];
|
||||
|
||||
error = 0;
|
||||
spin_lock_irq(¤t->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(¤t->sighand->siglock);
|
||||
if (error)
|
||||
goto out;
|
||||
if (oset)
|
||||
goto set_old;
|
||||
} else if (oset) {
|
||||
old_set = current->blocked.sig[0];
|
||||
set_old:
|
||||
error = -EFAULT;
|
||||
if (copy_to_user(oset, &old_set, sizeof(*oset)))
|
||||
goto out;
|
||||
return error;
|
||||
}
|
||||
error = 0;
|
||||
out:
|
||||
return error;
|
||||
|
||||
if (oset) {
|
||||
if (copy_to_user(oset, &old_set, sizeof(*oset)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* __ARCH_WANT_SYS_SIGPROCMASK */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user