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.thiba...@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 <aure...@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.thiba...@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