Skip to content

Commit a95933b

Browse files
committed
Fix Env vars
There was a bug in vars_os() where the vriable name contained NULL on the Rust side. It is fixed now Signed-off-by: Ayush <ayushsingh1325@gmail.com>
1 parent c83cbd2 commit a95933b

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

library/std/src/sys/uefi/os.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl Iterator for Env {
110110
self.last_var_name = k;
111111
match val {
112112
None => self.next(),
113-
Some(x) => Some((OsString::from_ucs2_lossy(&key), x)),
113+
Some(x) => Some((OsString::from_ucs2_null_termintated(&key), x)),
114114
}
115115
}
116116
}
@@ -271,12 +271,17 @@ pub(crate) mod uefi_vars {
271271
last_var_name: &[u16],
272272
last_guid: &r_efi::efi::Guid,
273273
) -> io::Result<(Vec<u16>, r_efi::efi::Guid)> {
274+
#[inline]
275+
fn buf_size(s: usize) -> usize {
276+
s / size_of::<u16>()
277+
}
278+
274279
let mut var_name = Vec::from(last_var_name);
275280
let mut var_size = var_name.capacity() * size_of::<u16>();
276281
let mut guid: r_efi::efi::Guid = *last_guid;
277282
match unsafe { get_next_variable_raw(&mut var_size, var_name.as_mut_ptr(), &mut guid) } {
278283
Ok(_) => {
279-
unsafe { var_name.set_len(var_size / size_of::<u16>()) };
284+
unsafe { var_name.set_len(buf_size(var_size)) };
280285
return Ok((var_name, guid));
281286
}
282287
Err(e) => {
@@ -286,12 +291,11 @@ pub(crate) mod uefi_vars {
286291
}
287292
}
288293

289-
var_name.reserve(var_size - (var_name.capacity() * size_of::<u16>()));
294+
var_name.reserve(buf_size(var_size) - var_name.capacity() + 1);
290295
var_size = var_name.capacity() * size_of::<u16>();
291296

292297
unsafe { get_next_variable_raw(&mut var_size, var_name.as_mut_ptr(), &mut guid) }?;
293-
294-
unsafe { var_name.set_len(var_size / size_of::<u16>()) };
298+
unsafe { var_name.set_len(buf_size(var_size)) };
295299
Ok((var_name, guid))
296300
}
297301

src/test/ui/process/try-wait.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#![allow(stable_features)]
44
// ignore-emscripten no processes
55
// ignore-sgx no processes
6-
6+
// ignore-uefi spawn function is blocking. Also kill not implemented.
77
#![feature(process_try_wait)]
88

99
use std::env;
@@ -18,13 +18,10 @@ fn main() {
1818
"sleep" => thread::sleep(Duration::new(1_000, 0)),
1919
_ => {}
2020
}
21-
return
21+
return;
2222
}
2323

24-
let mut me = Command::new(env::current_exe().unwrap())
25-
.arg("sleep")
26-
.spawn()
27-
.unwrap();
24+
let mut me = Command::new(env::current_exe().unwrap()).arg("sleep").spawn().unwrap();
2825
let maybe_status = me.try_wait().unwrap();
2926
assert!(maybe_status.is_none());
3027
let maybe_status = me.try_wait().unwrap();
@@ -38,15 +35,12 @@ fn main() {
3835
let status = me.try_wait().unwrap().unwrap();
3936
assert!(!status.success());
4037

41-
let mut me = Command::new(env::current_exe().unwrap())
42-
.arg("return-quickly")
43-
.spawn()
44-
.unwrap();
38+
let mut me = Command::new(env::current_exe().unwrap()).arg("return-quickly").spawn().unwrap();
4539
loop {
4640
match me.try_wait() {
4741
Ok(Some(res)) => {
4842
assert!(res.success());
49-
break
43+
break;
5044
}
5145
Ok(None) => {
5246
thread::sleep(Duration::from_millis(1));

0 commit comments

Comments
 (0)