mirror of
https://github.com/void-linux/void-packages.git
synced 2025-06-05 22:53:51 +02:00
musl: backport patch to fix #37382
This commit is contained in:
parent
d433185948
commit
e3aef00173
2 changed files with 50 additions and 1 deletions
|
@ -0,0 +1,49 @@
|
|||
From a5aff1972c9e3981566414b09a28e331ccd2be5d Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Thu, 17 Sep 2020 15:09:46 -0400
|
||||
Subject: [PATCH 237/513] avoid set*id/setrlimit misbehavior and hang in
|
||||
vforked/cloned child
|
||||
|
||||
taking the deprecated/dropped vfork spec strictly, doing pretty much
|
||||
anything but execve in the child is wrong and undefined. however,
|
||||
these are commonly needed operations to setup the child state before
|
||||
exec, and historical implementations tolerated them.
|
||||
|
||||
for single-threaded parents, these operations already worked as
|
||||
expected in the vforked child. however, due to the need for __synccall
|
||||
to synchronize id/resource limit changes among all threads, calling
|
||||
these functions in the vforked child of a multithreaded parent caused
|
||||
a misdirected broadcast signaling of all threads in the parent. these
|
||||
signals could kill the parent entirely if the synccall signal handler
|
||||
had never been installed in the parent, or could be ignored if it had,
|
||||
or could signal/kill one or more utterly wrong processes if the parent
|
||||
already terminated (due to vfork semantics, only possible via fatal
|
||||
signal) and the parent tids were recycled. in any case, the expected
|
||||
number of semaphore posts would never happen, so the child would
|
||||
permanently hang (with all signals blocked) waiting for them.
|
||||
|
||||
to mitigate this, and also make the normal usage case work as
|
||||
intended, treat the condition where the caller's actual tid does not
|
||||
match the tid in its thread structure as single-threaded, and bypass
|
||||
the entire synccall broadcast operation.
|
||||
---
|
||||
src/thread/synccall.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
|
||||
index 648a6ad4..d58c851f 100644
|
||||
--- a/src/thread/synccall.c
|
||||
+++ b/src/thread/synccall.c
|
||||
@@ -63,7 +63,8 @@ void __synccall(void (*func)(void *), void *ctx)
|
||||
sem_init(&target_sem, 0, 0);
|
||||
sem_init(&caller_sem, 0, 0);
|
||||
|
||||
- if (!libc.threads_minus_1) goto single_threaded;
|
||||
+ if (!libc.threads_minus_1 || __syscall(SYS_gettid) != self->tid)
|
||||
+ goto single_threaded;
|
||||
|
||||
callback = func;
|
||||
context = ctx;
|
||||
--
|
||||
2.41.0
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
pkgname=musl
|
||||
reverts="1.2.0_1"
|
||||
version=1.1.24
|
||||
revision=16
|
||||
revision=17
|
||||
archs="*-musl"
|
||||
bootstrap=yes
|
||||
build_style=gnu-configure
|
||||
|
|
Loading…
Add table
Reference in a new issue