• A
    std: Synchronize access to global env during `exec` · 4032b7a4
    Alex Crichton 提交于
    This commit, after reverting #55359, applies a different fix for #46775
    while also fixing #55775. The basic idea was to go back to pre-#55359
    libstd, and then fix #46775 in a way that doesn't expose #55775.
    
    The issue described in #46775 boils down to two problems:
    
    * First, the global environment is reset during `exec` but, but if the
      `exec` call fails then the global environment was a dangling pointer
      into free'd memory as the block of memory was deallocated when
      `Command` is dropped. This is fixed in this commit by installing a
      `Drop` stack object which ensures that the `environ` pointer is
      preserved on a failing `exec`.
    
    * Second, the global environment was accessed in an unsynchronized
      fashion during `exec`. This was fixed by ensuring that the
      Rust-specific environment lock is acquired for these system-level
      operations.
    
    Thanks to Alex Gaynor for pioneering the solution here!
    
    Closes #55775
    Co-authored-by: NAlex Gaynor <alex.gaynor@gmail.com>
    4032b7a4
process_unix.rs 16.8 KB