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: Slightly more robust env var handling #29305

Merged
merged 1 commit into from Nov 6, 2015

Conversation

alexcrichton
Copy link
Member

As discovered in #29298, env::set_var("", "") will panic, but it turns out
that it also deadlocks on Unix systems. This happens because if a panic
happens while holding the environment lock, we then go try to read
RUST_BACKTRACE, grabbing the environment lock, causing a deadlock.

Specifically, the changes made here are:

  • The environment lock is pushed into std::sys instead of std::env. This
    also only puts it in the Unix implementation, not Windows where the functions
    are already threadsafe.
  • The std::sys implementation now returns io::Result so panics are
    explicitly at the std::env level.

@rust-highfive
Copy link
Collaborator

r? @brson

(rust_highfive has picked a reviewer for you, use r? to override)

@tbu-
Copy link
Contributor

tbu- commented Oct 25, 2015

It would probably be nicer to include either the error code or the offending key, rather than just a static message.

@tbu-
Copy link
Contributor

tbu- commented Oct 25, 2015

Also, do we want to treat invalid key as missing? Should we also treat File::open("\0") as file not found?

@alexcrichton
Copy link
Member Author

Hm that's true about treating an invalid key, I'll switch it back to being a panic.

As discovered in rust-lang#29298, `env::set_var("", "")` will panic, but it turns out
that it *also* deadlocks on Unix systems. This happens because if a panic
happens while holding the environment lock, we then go try to read
RUST_BACKTRACE, grabbing the environment lock, causing a deadlock.

Specifically, the changes made here are:

* The environment lock is pushed into `std::sys` instead of `std::env`. This
  also only puts it in the Unix implementation, not Windows where the functions
  are already threadsafe.
* The `std::sys` implementation now returns `io::Result` so panics are
  explicitly at the `std::env` level. The panic messages have also been improved
  in these situations.
@alexcrichton
Copy link
Member Author

ping r? @brson

@brson
Copy link
Contributor

brson commented Nov 5, 2015

@bors r+

@bors
Copy link
Contributor

bors commented Nov 5, 2015

📌 Commit 4b43e07 has been approved by brson

@bors
Copy link
Contributor

bors commented Nov 6, 2015

⌛ Testing commit 4b43e07 with merge 41308a0...

bors added a commit that referenced this pull request Nov 6, 2015
As discovered in #29298, `env::set_var("", "")` will panic, but it turns out
that it *also* deadlocks on Unix systems. This happens because if a panic
happens while holding the environment lock, we then go try to read
RUST_BACKTRACE, grabbing the environment lock, causing a deadlock.

Specifically, the changes made here are:

* The environment lock is pushed into `std::sys` instead of `std::env`. This
  also only puts it in the Unix implementation, not Windows where the functions
  are already threadsafe.
* The `std::sys` implementation now returns `io::Result` so panics are
  explicitly at the `std::env` level.
@bors bors merged commit 4b43e07 into rust-lang:master Nov 6, 2015
@alexcrichton alexcrichton deleted the bad-getenv branch January 21, 2016 01:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants