[PATCH] A few fixes for dodgy tsk->blocked uses

David Wragg (dpw@doc.ic.ac.uk)
30 Nov 1999 02:07:19 +0000


Hi,

I wrote a perl script to perform simple checks on code that touches
the blocked field of task_struct. It found a small number of problems;
the patch to fix them is below.

It also found a whole bunch of problems in
drivers/char/ftape/zftape/zftape-init.c. That plays lots of games with
current->blocked, and never locks current->sigmask_lock or calls
recalc_sigpending. I'm not going to touch that one.

David Wragg

diff -rua linux-2.3.29/arch/mips/kernel/irixsig.c linux-2.3.29.mod/arch/mips/kernel/irixsig.c
--- linux-2.3.29/arch/mips/kernel/irixsig.c Thu Aug 19 19:28:02 1999
+++ linux-2.3.29.mod/arch/mips/kernel/irixsig.c Tue Nov 30 01:12:53 1999
@@ -512,6 +512,7 @@
spin_lock_irq(&current->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);

regs->regs[2] = -EINTR;
diff -rua linux-2.3.29/arch/mips/kernel/signal.c linux-2.3.29.mod/arch/mips/kernel/signal.c
--- linux-2.3.29/arch/mips/kernel/signal.c Thu Nov 25 21:55:22 1999
+++ linux-2.3.29.mod/arch/mips/kernel/signal.c Tue Nov 30 01:22:08 1999
@@ -52,6 +52,7 @@
spin_lock_irq(&current->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);

regs.regs[2] = EINTR;
@@ -78,6 +79,7 @@
spin_lock_irq(&current->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);

regs.regs[2] = EINTR;
diff -rua linux-2.3.29/arch/sparc/kernel/sys_sunos.c linux-2.3.29.mod/arch/sparc/kernel/sys_sunos.c
--- linux-2.3.29/arch/sparc/kernel/sys_sunos.c Mon Sep 13 20:02:35 1999
+++ linux-2.3.29.mod/arch/sparc/kernel/sys_sunos.c Tue Nov 30 01:09:15 1999
@@ -366,6 +366,7 @@
spin_lock_irq(&current->sigmask_lock);
old = current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
return old;
}
@@ -377,6 +378,7 @@
spin_lock_irq(&current->sigmask_lock);
retval = current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
return retval;
}
diff -rua linux-2.3.29/arch/sparc64/kernel/sys_sunos32.c linux-2.3.29.mod/arch/sparc64/kernel/sys_sunos32.c
--- linux-2.3.29/arch/sparc64/kernel/sys_sunos32.c Mon Sep 13 20:02:36 1999
+++ linux-2.3.29.mod/arch/sparc64/kernel/sys_sunos32.c Tue Nov 30 01:05:37 1999
@@ -323,6 +323,7 @@
spin_lock_irq(&current->sigmask_lock);
old = (u32) current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
return old;
}
@@ -334,6 +335,7 @@
spin_lock_irq(&current->sigmask_lock);
retval = (u32) current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
return retval;
}
diff -rua linux-2.3.29/drivers/char/saa5249.c linux-2.3.29.mod/drivers/char/saa5249.c
--- linux-2.3.29/drivers/char/saa5249.c Sun Nov 7 16:24:53 1999
+++ linux-2.3.29.mod/drivers/char/saa5249.c Tue Nov 30 00:50:01 1999
@@ -236,9 +236,10 @@

static void jdelay(unsigned long delay)
{
- sigset_t oldblocked = current->blocked;
+ sigset_t oldblocked;

spin_lock_irq(&current->sigmask_lock);
+ oldblocked = current->blocked;
sigfillset(&current->blocked);
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
diff -rua linux-2.3.29/fs/nfsd/nfssvc.c linux-2.3.29.mod/fs/nfsd/nfssvc.c
--- linux-2.3.29/fs/nfsd/nfssvc.c Sun Oct 31 14:46:50 1999
+++ linux-2.3.29.mod/fs/nfsd/nfssvc.c Tue Nov 30 00:19:07 1999
@@ -164,10 +164,12 @@
} else {
unsigned int signo;

+ spin_lock_irq(&current->sigmask_lock);
for (signo = 1; signo <= _NSIG; signo++)
if (sigismember(&current->signal, signo) &&
!sigismember(&current->blocked, signo))
break;
+ spin_unlock_irq(&current->sigmask_lock);
printk(KERN_WARNING "nfsd: terminating on signal %d\n", signo);
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/