|
@@ -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(¤t->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(¤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;
|
|
|
+ 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 */
|
|
|
|