aboutsummaryrefslogtreecommitdiff
path: root/ctr-std/src/sys/unix/args.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ctr-std/src/sys/unix/args.rs')
-rw-r--r--ctr-std/src/sys/unix/args.rs19
1 files changed, 9 insertions, 10 deletions
diff --git a/ctr-std/src/sys/unix/args.rs b/ctr-std/src/sys/unix/args.rs
index e1c7ffc..c3c033d 100644
--- a/ctr-std/src/sys/unix/args.rs
+++ b/ctr-std/src/sys/unix/args.rs
@@ -66,7 +66,8 @@ impl DoubleEndedIterator for Args {
target_os = "emscripten",
target_os = "haiku",
target_os = "l4re",
- target_os = "fuchsia"))]
+ target_os = "fuchsia",
+ target_os = "hermit"))]
mod imp {
use os::unix::prelude::*;
use ptr;
@@ -79,20 +80,20 @@ mod imp {
static mut ARGC: isize = 0;
static mut ARGV: *const *const u8 = ptr::null();
+ // We never call `ENV_LOCK.init()`, so it is UB to attempt to
+ // acquire this mutex reentrantly!
static LOCK: Mutex = Mutex::new();
pub unsafe fn init(argc: isize, argv: *const *const u8) {
- LOCK.lock();
+ let _guard = LOCK.lock();
ARGC = argc;
ARGV = argv;
- LOCK.unlock();
}
pub unsafe fn cleanup() {
- LOCK.lock();
+ let _guard = LOCK.lock();
ARGC = 0;
ARGV = ptr::null();
- LOCK.unlock();
}
pub fn args() -> Args {
@@ -104,13 +105,11 @@ mod imp {
fn clone() -> Vec<OsString> {
unsafe {
- LOCK.lock();
- let ret = (0..ARGC).map(|i| {
+ let _guard = LOCK.lock();
+ (0..ARGC).map(|i| {
let cstr = CStr::from_ptr(*ARGV.offset(i) as *const libc::c_char);
OsStringExt::from_vec(cstr.to_bytes().to_vec())
- }).collect();
- LOCK.unlock();
- return ret
+ }).collect()
}
}
}