summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld_lock.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/libexec/rtld-elf/rtld_lock.c b/libexec/rtld-elf/rtld_lock.c
index d1563e5..ea16c4d 100644
--- a/libexec/rtld-elf/rtld_lock.c
+++ b/libexec/rtld-elf/rtld_lock.c
@@ -365,8 +365,19 @@ _rtld_atfork_pre(int *locks)
{
RtldLockState ls[2];
+ if (locks == NULL)
+ return;
+
+ /*
+ * Warning: this does not work with the rtld compat locks
+ * above, since the thread signal mask is corrupted (set to
+ * all signals blocked) if two locks are taken in write mode.
+ * The caller of the _rtld_atfork_pre() must provide the
+ * working implementation of the locks, and libthr locks are
+ * fine.
+ */
wlock_acquire(rtld_phdr_lock, &ls[0]);
- rlock_acquire(rtld_bind_lock, &ls[1]);
+ wlock_acquire(rtld_bind_lock, &ls[1]);
/* XXXKIB: I am really sorry for this. */
locks[0] = ls[1].lockstate;
@@ -378,6 +389,9 @@ _rtld_atfork_post(int *locks)
{
RtldLockState ls[2];
+ if (locks == NULL)
+ return;
+
bzero(ls, sizeof(ls));
ls[0].lockstate = locks[2];
ls[1].lockstate = locks[0];
OpenPOWER on IntegriCloud