diff options
| author | Dan Gohman <dev@sunfishcode.online> | 2023-02-09 19:01:47 -0800 |
|---|---|---|
| committer | Dan Gohman <dev@sunfishcode.online> | 2023-02-09 19:03:42 -0800 |
| commit | 4b1157509f96e4fffe7ef40ab8cbaa08704d36cc (patch) | |
| tree | 8d8a262f28702e79ae4fded774ff658494268269 | |
| parent | 8996ea93b6e554148c4286e62b613f12a3ee505c (diff) | |
| download | rust-4b1157509f96e4fffe7ef40ab8cbaa08704d36cc.tar.gz rust-4b1157509f96e4fffe7ef40ab8cbaa08704d36cc.zip | |
Allow wasi-libc to initialize its environment variables lazily.
Use `__wasilibc_get_environ()` to read the environment variable list from wasi-libc instead of using `environ`. `environ` is a global variable which effectively requires wasi-libc to initialize the environment variables eagerly, and `__wasilibc_get_environ()` is specifically designed to be an alternative that lets wasi-libc intiailize its environment variables lazily. This should have the side effect of fixing at least some of the cases of #107635.
| -rw-r--r-- | library/std/src/sys/wasi/os.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/library/std/src/sys/wasi/os.rs b/library/std/src/sys/wasi/os.rs index f5513e9996d..9919dc7087e 100644 --- a/library/std/src/sys/wasi/os.rs +++ b/library/std/src/sys/wasi/os.rs @@ -21,6 +21,7 @@ mod libc { extern "C" { pub fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char; pub fn chdir(dir: *const c_char) -> c_int; + pub fn __wasilibc_get_environ() -> *mut *mut c_char; } } @@ -161,7 +162,12 @@ impl Iterator for Env { pub fn env() -> Env { unsafe { let _guard = env_read_lock(); - let mut environ = libc::environ; + + // Use `__wasilibc_get_environ` instead of `environ` here so that we + // don't require wasi-libc to eagerly initialize the environment + // variables. + let mut environ = libc::__wasilibc_get_environ(); + let mut result = Vec::new(); if !environ.is_null() { while !(*environ).is_null() { |
