From: Samuel Thibault Date: Thu, 28 Aug 2014 20:08:39 +0000 (+0200) Subject: Fix hang on fork X-Git-Tag: glibc-2.20~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17a62de1ff4c7548748a8d264382131f523f071a;p=thirdparty%2Fglibc.git 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 --- diff --git a/ChangeLog b/ChangeLog index 23c900dcf7b..eb604b854b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-08-28 Samuel Thibault + + * sysdeps/mach/hurd/fork.c (__fork): Lock SS->lock around + __proc_dostop call. + 2014-08-27 Mark Wielaard [BZ #17319] diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c index 60c34c76206..51bc2c07531 100644 --- a/sysdeps/mach/hurd/fork.c +++ b/sysdeps/mach/hurd/fork.c @@ -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;