signals: convert the IA32_EMULATION code to use set_current_blocked()
PATCH 1/1 signals: convert the IA32_EMULATION code to use set_current_blocked()
sys32_sigsuspend() and sys32_*sigreturn() change ->blocked directly. This is not correct, see the changelog in e6fa16ab "signal: sigprocmask() should do retarget_shared_pending()"
Change them to use set_current_blocked().
---
arch/x86/ia32/ia32_signal.c | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-)
arch/x86/ia32/ia32_signal.c renamed from arch/x86/ia32/ia32_signal.c~3_ia32_set_current_blocked +9 -13
@@ -127,15 +127,17 @@ int copy_siginfo_from_user32(siginfo_t *asmlinkage long sys32_sigsuspend (int history0,int history1,old_sigset_t mask) { - mask &= _BLOCKABLE; -spin_lock_irq (¤t->sighand->siglock); +sigset_t blocked; + current->saved_sigmask = current->blocked; -siginitset (¤t->blocked, mask); -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); + + mask &= _BLOCKABLE; +siginitset (&blocked, mask); +set_current_blocked (&blocked); current->state =TASK_INTERRUPTIBLE ;schedule (); +set_restore_sigmask ();return -ERESTARTNOHAND ; }
@@ -279,10 +281,7 @@ asmlinkage long sys32_sigreturn(struct p goto badframe;sigdelsetmask (&set, ~_BLOCKABLE); -spin_lock_irq (¤t->sighand->siglock); - current->blocked = set; -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); +set_current_blocked (&set);if (ia32_restore_sigcontext (regs, &frame->sc, &ax)) goto badframe;
@@ -308,10 +307,7 @@ asmlinkage long sys32_rt_sigreturn(struc goto badframe;sigdelsetmask (&set, ~_BLOCKABLE); -spin_lock_irq (¤t->sighand->siglock); - current->blocked = set; -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); +set_current_blocked (&set);if (ia32_restore_sigcontext (regs, &frame->uc.uc_mcontext, &ax)) goto badframe;
Quoted 7 lines · On Sun, 10 Jul 2011 21:27:24 +0200 Oleg Nesterov <[email protected]> wrote:
sys32_sigsuspend()and sys32_*sigreturn() change ->blocked directly. This is not correct, see the changelog ine6fa16ab"signal:sigprocmask()should doretarget_shared_pending()"Change them to use
set_current_blocked().Signed-off-by Oleg Nesterov <[email protected]>
Looks simple enough.
Quoted 7 lines · Oleg Nesterov
sys32_sigsuspend()and sys32_*sigreturn() change ->blocked directly. This is not correct, see the changelog ine6fa16ab"signal:sigprocmask()should doretarget_shared_pending()"Change them to use
set_current_blocked().Signed-off-by Oleg Nesterov <[email protected]>
Signature · 1 line
tejun
[tip:x86/signal] x86, signals: Convert the IA32_EMULATION code to use set_current_blocked()
In reply to Oleg NesterovCommit-ID: 905f29e2aa004560907199cc96248fa11bafea8a Gitweb: http://git.kernel.org/tip/905f29e2aa004560907199cc96248fa11bafea8a Author: Oleg Nesterov <[email protected]> AuthorDate: Sun, 10 Jul 2011 21:27:24 +0200 Committer: H. Peter Anvin <[email protected]> CommitDate: Thu, 14 Jul 2011 21:21:31 -0700
x86, signals: Convert the IA32_EMULATION code to use set_current_blocked()
sys32_sigsuspend() and sys32_*sigreturn() change ->blocked directly. This is not correct, see the changelog in e6fa16ab "signal: sigprocmask() should do retarget_shared_pending()"
Change them to use set_current_blocked().
--- arch/x86/ia32/ia32_signal.c | 22 +++++++++------------- 1 files changed, 9 insertions(+), 13 deletions(-)
arch/x86/ia32/ia32_signal.c +9 -13
@@ -127,15 +127,17 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)asmlinkage long sys32_sigsuspend (int history0,int history1,old_sigset_t mask) { - mask &= _BLOCKABLE; -spin_lock_irq (¤t->sighand->siglock); +sigset_t blocked; + current->saved_sigmask = current->blocked; -siginitset (¤t->blocked, mask); -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); + + mask &= _BLOCKABLE; +siginitset (&blocked, mask); +set_current_blocked (&blocked); current->state =TASK_INTERRUPTIBLE ;schedule (); +set_restore_sigmask ();return -ERESTARTNOHAND ; }
@@ -279,10 +281,7 @@ asmlinkage long sys32_sigreturn(struct pt_regs *regs) goto badframe;sigdelsetmask (&set, ~_BLOCKABLE); -spin_lock_irq (¤t->sighand->siglock); - current->blocked = set; -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); +set_current_blocked (&set);if (ia32_restore_sigcontext (regs, &frame->sc, &ax)) goto badframe;
@@ -308,10 +307,7 @@ asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) goto badframe;sigdelsetmask (&set, ~_BLOCKABLE); -spin_lock_irq (¤t->sighand->siglock); - current->blocked = set; -recalc_sigpending (); -spin_unlock_irq (¤t->sighand->siglock); +set_current_blocked (&set);if (ia32_restore_sigcontext (regs, &frame->uc.uc_mcontext, &ax)) goto badframe;