Hello,
I think there's a problem with the Posix.1b sigtimedwait() system call,
because a process is allowed to wait for SIGKILL or SIGSTOP, and theses
signals give their numbers to the calling process, forgetting their normal
behaviour.
So the following program is unkillable :
        #include <stdio.h>
        #include <signal.h>
        int
main (void)
{
        sigset_t	set;
        struct timespec timespec = {0, 0};
        sigfillset (& set);
        while (1)
                sigtimedwait (& set, NULL, & timespec);
        return (0);
}
Unkillable process means unable to umount the / partition during
shutdown, check forced at next reboot...  :-(
So, here's a little patch against 2.2.14 to fix the problem.
diff -urN linux-2.2.14/kernel/signal.c linux/kernel/signal.c
--- linux-2.2.14/kernel/signal.c        Mon Jan 10 20:25:40 2000
+++ linux/kernel/signal.c       Mon Jan 10 20:29:17 2000
@@ -740,11 +740,11 @@
 
        if (copy_from_user(&these, uthese, sizeof(these)))
                return -EFAULT;
-       else {
-               /* Invert the set of allowed signals to get those we
-                  want to block.  */
-               signotset(&these);
-       }
+
+       sigdelsetmask (&these, sigmask(SIGKILL)|sigmask(SIGSTOP));
+       /* Invert the set of allowed signals to get those we
+          want to block.  */
+       signotset(&these);
 
        if (uts) {
                if (copy_from_user(&ts, uts, sizeof(ts)))                       
-- Christophe Blaess- 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/
This archive was generated by hypermail 2b29 : Sat Jan 15 2000 - 21:00:16 EST