posix_spawn: parent can get stuck in uninterruptible sleep if child receives SIGTSTP early enough
Florian Weimer
fweimer@redhat.com
Thu Sep 22 17:38:00 GMT 2022
* Adhemerval Zanella Netto:
> On 22/09/22 09:18, Florian Weimer wrote:
>>> Is there anything that prevents to avoid using CLONE_VFORK? The code already
>>> uses a allocated stack and do synchronizes with waitpid.
>>
>> Assuming there is a way to create a thread which gets replaced by execve
>> only (instead the whole process), this won't work because we have to
>> block all signals for the new thread (it must not be visible to
>> application code, and signal handlers must not run on it), and we can't
>> unblock those signals prior to execve. With vfork, we can unblock them
>> after changing the signal handler disposition to SIG_DFL (preventing the
>> handler execution), but per-thread signal handlers have been removed
>> from Linux. So even if we somehow could prevent the termination signal
>> from beign sent to the whole process (and not just the fake thread), we
>> still have a gap.
>
> But we already block all internal signals with internal_signal_block_all
> prior clone call and it does not use CLONE_SIGHAND on the clone call.
> Also, independently of CLONE_SIGHAND, the calling process and child still
> have distinct signal masks. Recall for posix_spawn we do not use
> CLONE_THREAD, so per-thread signal handlers does not apply here.
This only works because we restore SIG_DFL before unblocking signals in
the new process. And that depends on a separate set of signal handlers.
> Doing some tests, the main problem is in fact how to synchronize
> the deallocation of the stack, since without CLONE_VFORK there is no way
> to advertise on a success call when execve has been called.
>
> But I agree that even without CLONE_VFORK we still have a small window,
> between the sigprocmask and execve, that the signal might act upon the
> child.
And that window shouldn't exist in the current implementation.
Thanks,
Florian
More information about the Libc-help
mailing list