]> git.ipfire.org Git - thirdparty/glibc.git/commit
malloc: Run fork handler as late as possible [BZ #19431]
authorFlorian Weimer <fweimer@redhat.com>
Thu, 14 Apr 2016 07:17:02 +0000 (09:17 +0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 27 Jan 2017 15:16:28 +0000 (13:16 -0200)
commit749c94d44c9aa063dfc7ad2b505c8e6d35e57345
tree23d25482719f96019972e9d2e4f959d3520d3775
parentb533edfeedf66e971b1b29affd8e2f1619987dc9
malloc: Run fork handler as late as possible [BZ #19431]

Previously, a thread M invoking fork would acquire locks in this order:

  (M1) malloc arena locks (in the registered fork handler)
  (M2) libio list lock

A thread F invoking flush (NULL) would acquire locks in this order:

  (F1) libio list lock
  (F2) individual _IO_FILE locks

A thread G running getdelim would use this order:

  (G1) _IO_FILE lock
  (G2) malloc arena lock

After executing (M1), (F1), (G1), none of the threads can make progress.

This commit changes the fork lock order to:

  (M'1) libio list lock
  (M'2) malloc arena locks

It explicitly encodes the lock order in the implementations of fork,
and does not rely on the registration order, thus avoiding the deadlock.
ChangeLog
malloc/Makefile
malloc/arena.c
malloc/malloc-internal.h [new file with mode: 0644]
malloc/malloc.c
malloc/tst-malloc-fork-deadlock.c [new file with mode: 0644]
manual/memory.texi
sysdeps/mach/hurd/fork.c
sysdeps/nptl/fork.c