lkml.org 
[lkml]   [2011]   [Aug]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 16/41] MIPS: Use set_current_blocked()
    Date
    From: Matt Fleming <matt.fleming@intel.com>

    As described in e6fa16ab ("signal: sigprocmask() should do
    retarget_shared_pending()") the modification of current->blocked is
    incorrect as we need to check whether the signal we're about to block
    is pending in the shared queue.

    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: David Daney <ddaney@caviumnetworks.com>
    Signed-off-by: Matt Fleming <matt.fleming@intel.com>
    ---
    arch/mips/kernel/signal.c | 29 ++++++++---------------------
    arch/mips/kernel/signal32.c | 20 ++++----------------
    arch/mips/kernel/signal_n32.c | 10 ++--------
    3 files changed, 14 insertions(+), 45 deletions(-)

    diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
    index dbbe0ce..bd3f75b 100644
    --- a/arch/mips/kernel/signal.c
    +++ b/arch/mips/kernel/signal.c
    @@ -255,11 +255,8 @@ asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
    return -EFAULT;
    sigdelsetmask(&newset, ~_BLOCKABLE);

    - spin_lock_irq(&current->sighand->siglock);
    current->saved_sigmask = current->blocked;
    - current->blocked = newset;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&newset);

    current->state = TASK_INTERRUPTIBLE;
    schedule();
    @@ -284,11 +281,8 @@ asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
    return -EFAULT;
    sigdelsetmask(&newset, ~_BLOCKABLE);

    - spin_lock_irq(&current->sighand->siglock);
    current->saved_sigmask = current->blocked;
    - current->blocked = newset;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&newset);

    current->state = TASK_INTERRUPTIBLE;
    schedule();
    @@ -360,10 +354,7 @@ asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
    goto badframe;

    sigdelsetmask(&blocked, ~_BLOCKABLE);
    - spin_lock_irq(&current->sighand->siglock);
    - current->blocked = blocked;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&blocked);

    sig = restore_sigcontext(&regs, &frame->sf_sc);
    if (sig < 0)
    @@ -399,10 +390,7 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
    goto badframe;

    sigdelsetmask(&set, ~_BLOCKABLE);
    - spin_lock_irq(&current->sighand->siglock);
    - current->blocked = set;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&set);

    sig = restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext);
    if (sig < 0)
    @@ -546,6 +534,7 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
    int ret;
    struct mips_abi *abi = current->thread.abi;
    void *vdso = current->mm->context.vdso;
    + sigset_t blocked;

    if (regs->regs[0]) {
    switch(regs->regs[2]) {
    @@ -578,12 +567,10 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
    if (ret)
    return ret;

    - spin_lock_irq(&current->sighand->siglock);
    - sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
    + sigorsets(&blocked, &current->blocked, &ka->sa.sa_mask);
    if (!(ka->sa.sa_flags & SA_NODEFER))
    - sigaddset(&current->blocked, sig);
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + sigaddset(&blocked, sig);
    + set_current_blocked(&blocked);

    return ret;
    }
    diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
    index aae9866..902a889 100644
    --- a/arch/mips/kernel/signal32.c
    +++ b/arch/mips/kernel/signal32.c
    @@ -290,11 +290,8 @@ asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
    return -EFAULT;
    sigdelsetmask(&newset, ~_BLOCKABLE);

    - spin_lock_irq(&current->sighand->siglock);
    current->saved_sigmask = current->blocked;
    - current->blocked = newset;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&newset);

    current->state = TASK_INTERRUPTIBLE;
    schedule();
    @@ -318,11 +315,8 @@ asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
    return -EFAULT;
    sigdelsetmask(&newset, ~_BLOCKABLE);

    - spin_lock_irq(&current->sighand->siglock);
    current->saved_sigmask = current->blocked;
    - current->blocked = newset;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&newset);

    current->state = TASK_INTERRUPTIBLE;
    schedule();
    @@ -488,10 +482,7 @@ asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
    goto badframe;

    sigdelsetmask(&blocked, ~_BLOCKABLE);
    - spin_lock_irq(&current->sighand->siglock);
    - current->blocked = blocked;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&blocked);

    sig = restore_sigcontext32(&regs, &frame->sf_sc);
    if (sig < 0)
    @@ -529,10 +520,7 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
    goto badframe;

    sigdelsetmask(&set, ~_BLOCKABLE);
    - spin_lock_irq(&current->sighand->siglock);
    - current->blocked = set;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&set);

    sig = restore_sigcontext32(&regs, &frame->rs_uc.uc_mcontext);
    if (sig < 0)
    diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c
    index ee24d81..30fc7ff 100644
    --- a/arch/mips/kernel/signal_n32.c
    +++ b/arch/mips/kernel/signal_n32.c
    @@ -94,11 +94,8 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
    sigset_from_compat(&newset, &uset);
    sigdelsetmask(&newset, ~_BLOCKABLE);

    - spin_lock_irq(&current->sighand->siglock);
    current->saved_sigmask = current->blocked;
    - current->blocked = newset;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&newset);

    current->state = TASK_INTERRUPTIBLE;
    schedule();
    @@ -122,10 +119,7 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
    goto badframe;

    sigdelsetmask(&set, ~_BLOCKABLE);
    - spin_lock_irq(&current->sighand->siglock);
    - current->blocked = set;
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + set_current_blocked(&set);

    sig = restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext);
    if (sig < 0)
    --
    1.7.4.4


    \
     
     \ /
      Last update: 2011-08-11 16:05    [W:0.032 / U:0.036 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site