Merged
Conversation
Previously to spawn a process with a closed standard handle, we would use `posix_spawn_file_action_addclose`. However, it turns out that POSIX specifies that `spawnp()` may fail if `addclose()` is used on an fd that is already closed. While glibc and musl appear to ignore this aspect of the specification, Darwin indeed follows it leading to haskell#251. This behavior is rather unfortunate as `posix_spawn_file_action_addclose` is a convenient way to close a handle in a subprocess in a race-free manner (e.g. unlike `O_CLOEXEC`, which is global). To avoid haskell#251 we must first use `posix_spawn_file_action_addopen` on the fd (e.g. opening `/dev/null`) to be closed to ensure that it is valid, which has the side-effect of closing the inherited fd. We can then safely use `posix_spawn_file_action_addclose` to close the fd. Fixes haskell#251.
Contributor
Author
|
Unfortunately I found that the current Cabal-driven testsuite isn't particularly well-suited to test this, consequently I ended up adding a test in GHC's testsuite. Testing this locally as we speak. |
Contributor
Author
|
I have confirmed that the test reproduces #251 on Darwin without this change and that the change fixes it. |
Contributor
Author
|
Note that I ultimately opted not to make the |
Member
|
Is this released? I can't find it in https://hackage.haskell.org/package/process-1.6.15.0/changelog |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Previously to spawn a process with a closed standard handle, we
would use
posix_spawn_file_action_addclose. However, it turns out thatPOSIX specifies that
spawnp()may fail ifaddclose()is used on anfd that is already closed. While glibc and musl appear to ignore this
aspect of the specification, Darwin indeed follows it leading to #251.
This behavior is rather unfortunate as
posix_spawn_file_action_addcloseis a convenient way to close a handlein a subprocess in a race-free manner (e.g. unlike
O_CLOEXEC, which isglobal). To avoid #251 we must first use
posix_spawn_file_action_addopenon the fd (e.g. opening/dev/null)to be closed to ensure that it is valid, which has the side-effect of
closing the inherited fd. We can then safely use
posix_spawn_file_action_addcloseto close the fd.Fixes #251.