Skip to content
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

std: Don't pass overlapped handles to processes #38835

Merged
merged 1 commit into from
Jan 7, 2017

Commits on Jan 4, 2017

  1. std: Don't pass overlapped handles to processes

    This commit fixes a mistake introduced in rust-lang#31618 where overlapped handles were
    leaked to child processes on Windows. On Windows once a handle is in overlapped
    mode it should always have I/O executed with an instance of `OVERLAPPED`. Most
    child processes, however, are not prepared to have their stdio handles in
    overlapped mode as they don't use `OVERLAPPED` on reads/writes to the handle.
    
    Now we haven't had any odd behavior in Rust up to this point, and the original
    bug was introduced almost a year ago. I believe this is because it turns out
    that if you *don't* pass an `OVERLAPPED` then the system will [supply one for
    you][link]. In this case everything will go awry if you concurrently operate on
    the handle. In Rust, however, the stdio handles are always locked, and there's
    no way to not use them unlocked in libstd. Due to that change we've always had
    synchronized access to these handles, which means that Rust programs typically
    "just work".
    
    Conversely, though, this commit fixes the test case included, which exhibits
    behavior that other programs Rust spawns may attempt to execute. Namely, the
    stdio handles may be concurrently used and having them in overlapped mode wreaks
    havoc.
    
    [link]: https://blogs.msdn.microsoft.com/oldnewthing/20121012-00/?p=6343
    
    Closes rust-lang#38811
    alexcrichton committed Jan 4, 2017
    Configuration menu
    Copy the full SHA
    5148918 View commit details
    Browse the repository at this point in the history