lkml.org 
[lkml]   [2011]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 4/6] 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>
    ---

    kernel/signal.c | 37 ++++++++++++++++---------------------
    1 file changed, 16 insertions(+), 21 deletions(-)

    --- sigprocmask/kernel/signal.c~4_cleanup_old_sigprocmask 2011-04-26 19:53:55.000000000 +0200
    +++ sigprocmask/kernel/signal.c 2011-04-26 19:54:09.000000000 +0200
    @@ -2691,29 +2691,28 @@ SYSCALL_DEFINE1(sigpending, old_sigset_t
    /**
    * 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;
    @@ -2732,19 +2731,15 @@ SYSCALL_DEFINE3(sigprocmask, int, how, o
    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 */



    \
     
     \ /
      Last update: 2011-04-26 21:53    [W:0.030 / U:457.348 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site