Commit 835959e8 authored by Greg Ungerer's avatar Greg Ungerer Committed by Linus Torvalds

[PATCH] m68knommu spinlocks around signal api calls

This adds spinlocks around calls to generic kernel signal routine calls.
parent e7189fb9
...@@ -63,9 +63,11 @@ asmlinkage int do_sigsuspend(struct pt_regs *regs) ...@@ -63,9 +63,11 @@ asmlinkage int do_sigsuspend(struct pt_regs *regs)
sigset_t saveset; sigset_t saveset;
mask &= _BLOCKABLE; mask &= _BLOCKABLE;
spin_lock_irq(&current->sig->siglock);
saveset = current->blocked; saveset = current->blocked;
siginitset(&current->blocked, mask); siginitset(&current->blocked, mask);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock);
regs->d0 = -EINTR; regs->d0 = -EINTR;
while (1) { while (1) {
...@@ -91,9 +93,11 @@ do_rt_sigsuspend(struct pt_regs *regs) ...@@ -91,9 +93,11 @@ do_rt_sigsuspend(struct pt_regs *regs)
return -EFAULT; return -EFAULT;
sigdelsetmask(&newset, ~_BLOCKABLE); sigdelsetmask(&newset, ~_BLOCKABLE);
spin_lock_irq(&current->sig->siglock);
saveset = current->blocked; saveset = current->blocked;
current->blocked = newset; current->blocked = newset;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock);
regs->d0 = -EINTR; regs->d0 = -EINTR;
while (1) { while (1) {
...@@ -366,8 +370,10 @@ asmlinkage int do_sigreturn(unsigned long __unused) ...@@ -366,8 +370,10 @@ asmlinkage int do_sigreturn(unsigned long __unused)
goto badframe; goto badframe;
sigdelsetmask(&set, ~_BLOCKABLE); sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sig->siglock);
current->blocked = set; current->blocked = set;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock);
if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0)) if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0))
goto badframe; goto badframe;
...@@ -393,8 +399,10 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused) ...@@ -393,8 +399,10 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused)
goto badframe; goto badframe;
sigdelsetmask(&set, ~_BLOCKABLE); sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sig->siglock);
current->blocked = set; current->blocked = set;
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock);
if (rt_restore_ucontext(regs, sw, &frame->uc, &d0)) if (rt_restore_ucontext(regs, sw, &frame->uc, &d0))
goto badframe; goto badframe;
...@@ -729,10 +737,13 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -729,10 +737,13 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
if (ka->sa.sa_flags & SA_ONESHOT) if (ka->sa.sa_flags & SA_ONESHOT)
ka->sa.sa_handler = SIG_DFL; ka->sa.sa_handler = SIG_DFL;
if (!(ka->sa.sa_flags & SA_NODEFER)) {
spin_lock_irq(&current->sig->siglock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
if (!(ka->sa.sa_flags & SA_NODEFER))
sigaddset(&current->blocked,sig); sigaddset(&current->blocked,sig);
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sig->siglock);
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment