mirror of
git://git.musl-libc.org/musl
synced 2025-02-02 03:51:41 +00:00
fix deadlock in synccall after threaded fork
synccall may be called by AS-safe functions such as setuid/setgid after fork. although fork() resets libc.threads_minus_one, causing synccall to take the single-threaded path, synccall still takes the thread list lock. This lock may be held by another thread if for example fork() races with pthread_create(). After fork(), the value of the lock is meaningless, so clear it. maintainer's note: commit8f11e6127f
ande4235d7067
introduced this regression. the state protected by this lock is the linked list, which is entirely replaced in the child path of fork (next=prev=self), so resetting it is semantically sound.
This commit is contained in:
parent
3d178a7e2b
commit
84ebec6cee
@ -28,6 +28,7 @@ pid_t fork(void)
|
||||
self->robust_list.off = 0;
|
||||
self->robust_list.pending = 0;
|
||||
self->next = self->prev = self;
|
||||
__thread_list_lock = 0;
|
||||
libc.threads_minus_1 = 0;
|
||||
}
|
||||
__restore_sigs(&set);
|
||||
|
Loading…
Reference in New Issue
Block a user