cvs commit: src/sys/kern kern_fork.c kern_proc.c kern_sig.c src/sys/sys proc.h signalvar.h unistd.h
Matthew Dillon
dillon at crater.dragonflybsd.org
Tue Oct 10 08:42:18 PDT 2006
dillon 2006/10/10 08:40:47 PDT
DragonFly src repository
Modified files:
sys/kern kern_fork.c kern_proc.c kern_sig.c
sys/sys proc.h signalvar.h unistd.h
Log:
Fix a long-standing bug inherited from FreeBSD. It is possible for a
signal sent to a process group to race a fork(). If the signal is received
by the process doing the fork() before it finishes hooking up the new child
to the process group the new child will not receive the signal. The result
is that ^C does not always kill all the processes in the process group.
The problem occurs on UP systems if fork1() in the kernel blocks prior to
finishing the process setup. Such blocking can occur in MALLOC. The problem
can also occur if an interrupt occurs just as the process issues the fork()
system call, or on SMP systems where the signal is sent from a different cpu.
The solution is to use a lockmgr() lock to interlock the pgrp structure when
a signal is being sent to a process group and to have fork() check for
signal pre-conditions and return ERESTART if such conditions exist to force
processing of the pending signals.
NOTE! BMAKE, MAKE, GNUMAKE ALSO HAVE UNRELATED SIGNALING BUGS. These
programs improperly install a SIG_IGN for a few microseconds in order to
test the current signal function for SIGINT and various other signals.
If a ^C is sent while *MAKE is in this window, the *MAKE will ignore the
signal.
Reviewed-by: "Simon 'corecode' Schubert" <corecode at xxxxxxxxxxxx>
Revision Changes Path
1.58 +33 -7 src/sys/kern/kern_fork.c
1.29 +1 -0 src/sys/kern/kern_proc.c
1.55 +16 -3 src/sys/kern/kern_sig.c
1.87 +2 -0 src/sys/sys/proc.h
1.15 +19 -1 src/sys/sys/signalvar.h
1.6 +3 -2 src/sys/sys/unistd.h
http://www.dragonflybsd.org/cvsweb/src/sys/kern/kern_fork.c.diff?r1=1.57&r2=1.58&f=u
http://www.dragonflybsd.org/cvsweb/src/sys/kern/kern_proc.c.diff?r1=1.28&r2=1.29&f=u
http://www.dragonflybsd.org/cvsweb/src/sys/kern/kern_sig.c.diff?r1=1.54&r2=1.55&f=u
http://www.dragonflybsd.org/cvsweb/src/sys/sys/proc.h.diff?r1=1.86&r2=1.87&f=u
http://www.dragonflybsd.org/cvsweb/src/sys/sys/signalvar.h.diff?r1=1.14&r2=1.15&f=u
http://www.dragonflybsd.org/cvsweb/src/sys/sys/unistd.h.diff?r1=1.5&r2=1.6&f=u
More information about the Commits
mailing list