about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-09-22 01:45:48 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-09-22 01:45:48 +0200
commite67f54ab1a6253dd69cb2c770d785c7eb6d2172c (patch)
tree69632c1338d0f7f0790b0f1b3a17ac11e9b1847f /sysdeps
parent87ab10d6524fe4faabd7eb3eac5868165ecfb323 (diff)
downloadglibc-e67f54ab1a6253dd69cb2c770d785c7eb6d2172c.tar.gz
glibc-e67f54ab1a6253dd69cb2c770d785c7eb6d2172c.tar.xz
glibc-e67f54ab1a6253dd69cb2c770d785c7eb6d2172c.zip
hurdmalloc: Run fork handler as late as possible [BZ #19431]
This is the hurd-specific follow-up for
29d794863cd6e03115d3670707cc873a9965ba92 : hurdmalloc also needs the
same fix

	* hurd/hurdmalloc.c (malloc_fork_prepare): Rename to
	_hurd_malloc_fork_prepare.
	(malloc_fork_parent): Rename to _hurd_malloc_fork_parent.
	(malloc_fork_child): Rename to _hurd_malloc_fork_child.
	(_hurd_fork_prepare_hook): Drop malloc_fork_prepare.
	(_hurd_fork_parent_hook): Drop malloc_fork_parent.
	(_hurd_fork_child_hook): Drop malloc_fork_child.
	* hurd/hurdmalloc.h (_hurd_malloc_fork_prepare,
	_hurd_malloc_fork_parent, _hurd_malloc_fork_child): Add declarations.
	* sysdeps/mach/hurd/fork.c (__fork): Call __malloc_fork_lock_parent
	after locking locks (notably hurd_dtable_lock). Call
	_hurd_malloc_fork_prepare after that. Call _hurd_malloc_fork_parent
	before __malloc_fork_unlock_parent and _hurd_malloc_fork_child before
	__malloc_fork_unlock_child.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/mach/hurd/fork.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c
index 9973b1bb9e..9e863a8033 100644
--- a/sysdeps/mach/hurd/fork.c
+++ b/sysdeps/mach/hurd/fork.c
@@ -108,12 +108,6 @@ __fork (void)
       /* Run things that prepare for forking before we create the task.  */
       RUN_HOOK (_hurd_fork_prepare_hook, ());
 
-      /* Acquire malloc locks.  This needs to come last because fork
-	 handlers may use malloc, and the libio list lock has an
-	 indirect malloc dependency as well (via the getdelim
-	 function).  */
-      call_function_static_weak (__malloc_fork_lock_parent);
-
       /* Lock things that want to be locked before we fork.  */
       {
 	void *const *p;
@@ -124,6 +118,13 @@ __fork (void)
       }
       __mutex_lock (&_hurd_siglock);
 
+      /* Acquire malloc locks.  This needs to come last because fork
+	 handlers may use malloc, and the libio list lock has an
+	 indirect malloc dependency as well (via the getdelim
+	 function).  */
+      call_function_static_weak (__malloc_fork_lock_parent);
+      _hurd_malloc_fork_prepare ();
+
       newtask = MACH_PORT_NULL;
       thread = sigthread = MACH_PORT_NULL;
       newproc = MACH_PORT_NULL;
@@ -612,6 +613,7 @@ __fork (void)
 	}
 
       /* Release malloc locks.  */
+      _hurd_malloc_fork_parent ();
       call_function_static_weak (__malloc_fork_unlock_parent);
 
       /* Run things that want to run in the parent to restore it to
@@ -666,6 +668,7 @@ __fork (void)
       __sigemptyset (&_hurdsig_traced);
 
       /* Release malloc locks.  */
+      _hurd_malloc_fork_child ();
       call_function_static_weak (__malloc_fork_unlock_child);
 
       /* Run things that want to run in the child task to set up.  */