summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2014-08-28 22:08:39 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2014-08-28 22:09:29 +0200
commit17a62de1ff4c7548748a8d264382131f523f071a (patch)
tree8751a44b0738acbc264930a4e0d2a11c0bf499de
parent9570bc53fcc11d3cfe028989e611266e8d55bd09 (diff)
downloadglibc-17a62de1ff4c7548748a8d264382131f523f071a.tar.gz
glibc-17a62de1ff4c7548748a8d264382131f523f071a.tar.xz
glibc-17a62de1ff4c7548748a8d264382131f523f071a.zip
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>
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/mach/hurd/fork.c4
2 files changed, 9 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 23c900dcf7..eb604b854b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c
index 60c34c7620..51bc2c0753 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;