On Darwin, lock access to the environ
block.
#403
Merged
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.
This PR adds calls to Darwin's internal libc functions
environ_lock_np()
andenviron_unlock_np()
when directly accessing theenviron
block (via the CRT function_NSGetEnviron()
.)These calls are necessary because direct access to
environ
is not thread-safe by default. The standard library guards accesses togetenv()
andsetenv()
, butenviron
is a global variable and neither it nor_NSGetEnviron()
can be made thread-safe internally.This change does not prevent data races when using the result of
getenv()
, but short of a newcopyenv_np()
orgetenv_r()
function, there's not much we can do about it. This change has no effect on Linux since it doesn't have these non-portable functions, but if equivalents are added in the future, we can add support too. Windows'GetEnvironmentStringsW()
API returns a copy of the environment block, so it doesn't need a lock.Compare Foundation's use here.
Checklist: