Fix hang on fork

If e.g. a signal is being received while we are running fork(), the signal
thread may be having our SS lock when we make the space copy, and thus in the
child we can not take the SS lock any more.

* sysdeps/mach/hurd/fork.c (__fork): Lock SS->lock around __proc_dostop call.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
Samuel Thibault 2014-08-28 22:08:39 +02:00
parent 9570bc53fc
commit 17a62de1ff
2 changed files with 9 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2014-08-28 Samuel Thibault <samuel.thibault@ens-lyon.org>
* sysdeps/mach/hurd/fork.c (__fork): Lock SS->lock around
__proc_dostop call.
2014-08-27 Mark Wielaard <mjw@redhat.com>
[BZ #17319]

View File

@ -129,9 +129,13 @@ __fork (void)
ports_locked = 1;
/* Keep our SS locked while stopping other threads, so they don't get a
chance to have it locked in the copied space. */
__spin_lock (&ss->lock);
/* Stop all other threads while copying the address space,
so nothing changes. */
err = __proc_dostop (_hurd_ports[INIT_PORT_PROC].port, ss->thread);
__spin_unlock (&ss->lock);
if (!err)
{
stopped = 1;