--- exit.c~ Mon Feb 25 20:38:13 2002 +++ exit.c Tue Mar 19 21:47:58 2002 @@ -429,6 +429,38 @@ write_unlock_irq(&tasklist_lock); } +#define __KERNEL_SYSCALLS__ +#include +NORET_TYPE void flush_child_loop(struct task_struct *curtask) +{ + struct k_sigaction sa; + daemonize(); + + spin_lock_irq(&curtask->sigmask_lock); + siginitsetinv(&curtask->blocked, sigmask(SIGCHLD)); + recalc_sigpending(curtask); + spin_unlock_irq(&curtask->sigmask_lock); + + /* Install a handler so SIGCLD is delivered */ + sa.sa.sa_handler = SIG_IGN; + sa.sa.sa_flags = 0; + siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD)); + do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0); + + for (;;) { + set_task_state(curtask, TASK_INTERRUPTIBLE); + schedule(); + if (signal_pending(curtask)) { + while (waitpid(-1, (unsigned int *)0, __WALL|WNOHANG) > 0) + ; + spin_lock_irq(&curtask->sigmask_lock); + flush_signals(curtask); + recalc_sigpending(curtask); + spin_unlock_irq(&curtask->sigmask_lock); + } + } +} + NORET_TYPE void do_exit(long code) { struct task_struct *tsk = current; @@ -437,8 +469,10 @@ panic("Aiee, killing interrupt handler!"); if (!tsk->pid) panic("Attempted to kill the idle task!"); - if (tsk->pid == 1) - panic("Attempted to kill init!"); + if (tsk->pid == 1) { + printk(KERN_EMERG "Attempted to kill init!\n"); + flush_child_loop(tsk); + } tsk->flags |= PF_EXITING; del_timer_sync(&tsk->real_timer);