-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unix process spawn may trigger UB for pthread lock behavior. #82879
Comments
Based on some discussion on Zulip, I think the right approach would be to reinitialize the lock in the child, immediately after the fork. We can't just forget the lock; that will break usage of the environment within a |
Is this a duplicate of #64718? (Also, as mentioned in #64718 (comment), it seems none of the
|
But |
Indeed this is a duplicate of #64718, thanks for the link! Closing, let's keep the discussion consolidated there. |
When spawning a process in the case where
posix_spawn
cannot be used, the spawn code usesfork
/execvp
. It acquires the environment lock before the fork, with a drop handler that unlocks it. Unfortunately, this is done in both the parent and child processes, and unlocking a lock acquired from another thread is undefined behavior (seepthread_rwlock_unlock
andpthread_mutex_unlock
).An example of where this can happen is rustdoc running doctests. It has N threads all spawning
rustc
processes. It was observed in #82221 that this was frequently causing deadlocks (i686, on a Docker image with glibc 2.23).PR #82877 reverts the change from mutex to rwlock, but
pthread_mutex_unlock
is also undefined behavior, we just fortunately have not run into any problems. This should be fixed. This can probably be done by mem::forget'ing the guard.https://stackoverflow.com/questions/61976745/why-does-rust-rwlock-behave-unexpectedly-with-fork also provides some insight into why unlocking a rwlock after a fork doesn't work.
rustc 1.52.0-nightly (caca212 2021-03-05)
The text was updated successfully, but these errors were encountered: