[glibc] 01/02: hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch sid
in repository glibc.
commit 462e3c3bdbd68511a97921ad5fdacb66f55fe1c4
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Wed Sep 21 23:51:46 2016 +0000
hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency
between hurd_malloc and fork, triggered by malloc/tst-malloc-fork-deadlock.
---
debian/changelog | 2 +
debian/patches/hurd-i386/cvs-mallocfork.diff | 132 +++++++++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 135 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index e0bf10a..a558e19 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,6 +7,8 @@ glibc (2.24-4) UNRELEASED; urgency=medium
* hurd-i386/tg-hurdsig-fixes.diff: Fix uninitialized value.
* hurd-i386/submitted-exec_filename.diff: Add missing includes, fix const
warning.
+ * hurd-i386/cvs-mallocfork.diff: New patch to fix concurrency between
+ hurd_malloc and fork, triggered by malloc/tst-malloc-fork-deadlock.
-- Aurelien Jarno <aurel32@debian.org> Sat, 17 Sep 2016 20:03:04 +0200
diff --git a/debian/patches/hurd-i386/cvs-mallocfork.diff b/debian/patches/hurd-i386/cvs-mallocfork.diff
new file mode 100644
index 0000000..d59de24
--- /dev/null
+++ b/debian/patches/hurd-i386/cvs-mallocfork.diff
@@ -0,0 +1,132 @@
+commit e67f54ab1a6253dd69cb2c770d785c7eb6d2172c
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date: Thu Sep 22 01:45:48 2016 +0200
+
+ 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.
+
+Index: glibc-2.24/hurd/hurdmalloc.c
+===================================================================
+--- glibc-2.24.orig/hurd/hurdmalloc.c
++++ glibc-2.24/hurd/hurdmalloc.c
+@@ -405,8 +405,8 @@ print_malloc_free_list (void)
+ }
+ #endif /* DEBUG */
+
+-static void
+-malloc_fork_prepare(void)
++void
++_hurd_malloc_fork_prepare(void)
+ /*
+ * Prepare the malloc module for a fork by insuring that no thread is in a
+ * malloc critical section.
+@@ -419,8 +419,8 @@ malloc_fork_prepare(void)
+ }
+ }
+
+-static void
+-malloc_fork_parent(void)
++void
++_hurd_malloc_fork_parent(void)
+ /*
+ * Called in the parent process after a fork() to resume normal operation.
+ */
+@@ -432,8 +432,8 @@ malloc_fork_parent(void)
+ }
+ }
+
+-static void
+-malloc_fork_child(void)
++void
++_hurd_malloc_fork_child(void)
+ /*
+ * Called in the child process after a fork() to resume normal operation.
+ */
+@@ -446,7 +446,4 @@ malloc_fork_child(void)
+ }
+
+
+-text_set_element (_hurd_fork_prepare_hook, malloc_fork_prepare);
+-text_set_element (_hurd_fork_parent_hook, malloc_fork_parent);
+-text_set_element (_hurd_fork_child_hook, malloc_fork_child);
+ text_set_element (_hurd_preinit_hook, malloc_init);
+Index: glibc-2.24/hurd/hurdmalloc.h
+===================================================================
+--- glibc-2.24.orig/hurd/hurdmalloc.h
++++ glibc-2.24/hurd/hurdmalloc.h
+@@ -12,6 +12,10 @@ extern void *_hurd_malloc (size_t);
+ extern void *_hurd_realloc (void *, size_t);
+ extern void _hurd_free (void *);
+
++extern void _hurd_malloc_fork_prepare (void);
++extern void _hurd_malloc_fork_parent (void);
++extern void _hurd_malloc_fork_child (void);
++
+ #define malloc _hurd_malloc
+ #define realloc _hurd_realloc
+ #define free _hurd_free
+Index: glibc-2.24/sysdeps/mach/hurd/fork.c
+===================================================================
+--- glibc-2.24.orig/sysdeps/mach/hurd/fork.c
++++ glibc-2.24/sysdeps/mach/hurd/fork.c
+@@ -109,12 +109,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). */
+- __malloc_fork_lock_parent ();
+-
+ /* Lock things that want to be locked before we fork. */
+ {
+ void *const *p;
+@@ -125,6 +119,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). */
++ __malloc_fork_lock_parent ();
++ _hurd_malloc_fork_prepare ();
++
+ newtask = MACH_PORT_NULL;
+ thread = sigthread = MACH_PORT_NULL;
+ newproc = MACH_PORT_NULL;
+@@ -617,6 +618,7 @@ __fork (void)
+ }
+
+ /* Release malloc locks. */
++ _hurd_malloc_fork_parent ();
+ __malloc_fork_unlock_parent ();
+
+ /* Run things that want to run in the parent to restore it to
+@@ -688,6 +690,7 @@ __fork (void)
+ __sigemptyset (&ss->pending);
+
+ /* Release malloc locks. */
++ _hurd_malloc_fork_child ();
+ __malloc_fork_unlock_child ();
+
+ /* Run things that want to run in the child task to set up. */
diff --git a/debian/patches/series b/debian/patches/series
index dfeadce..def94a3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -142,6 +142,7 @@ hurd-i386/tg-eintr.diff
hurd-i386/git-recvmsg.diff
hurd-i386/tg-gsync-libc.diff
hurd-i386/cvs-adjtime-NULL.diff
+hurd-i386/cvs-mallocfork.diff
i386/local-biarch.diff
i386/local-cmov.diff
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-glibc/glibc.git
Reply to: