Skip to content

Commit 72aa9c2

Browse files
committed
implement Windows shim for 'GetEnvironmentStringsW'
1 parent 2e0bda8 commit 72aa9c2

File tree

3 files changed

+17
-16
lines changed

3 files changed

+17
-16
lines changed

src/helpers.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -493,17 +493,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
493493
/// Helper function to read an OsString from a 0x0000-terminated sequence of u16,
494494
/// which is what the Windows APIs usually handle.
495495
fn read_os_str_from_wide_str(&self, scalar: Scalar<Tag>) -> InterpResult<'tcx, OsString> {
496-
#[cfg(target_os = "windows")]
497-
fn u16vec_to_osstring<'tcx>(u16_vec: Vec<u16>) -> InterpResult<'tcx, OsString> {
498-
Ok(std::os::windows::ffi::OsStringExt::from_wide(&u16_vec[..]))
499-
}
500-
#[cfg(not(target_os = "windows"))]
501-
fn u16vec_to_osstring<'tcx>(u16_vec: Vec<u16>) -> InterpResult<'tcx, OsString> {
502-
let s = String::from_utf16(&u16_vec[..])
503-
.map_err(|_| err_unsup_format!("{:?} is not a valid utf-16 string", u16_vec))?;
504-
Ok(s.into())
505-
}
506-
507496
let u16_vec = self.eval_context_ref().memory.read_wide_str(scalar)?;
508497
u16vec_to_osstring(u16_vec)
509498
}
@@ -637,6 +626,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
637626
}
638627
}
639628

629+
#[cfg(target_os = "windows")]
630+
pub fn u16vec_to_osstring<'tcx>(u16_vec: Vec<u16>) -> InterpResult<'tcx, OsString> {
631+
Ok(std::os::windows::ffi::OsStringExt::from_wide(&u16_vec[..]))
632+
}
633+
#[cfg(not(target_os = "windows"))]
634+
pub fn u16vec_to_osstring<'tcx>(u16_vec: Vec<u16>) -> InterpResult<'tcx, OsString> {
635+
let s = String::from_utf16(&u16_vec[..])
636+
.map_err(|_| err_unsup_format!("{:?} is not a valid utf-16 string", u16_vec))?;
637+
Ok(s.into())
638+
}
639+
640640
pub fn immty_from_int_checked<'tcx>(
641641
int: impl Into<i128>,
642642
layout: TyLayout<'tcx>,

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub use crate::diagnostics::{
4949
NonHaltingDiagnostic,
5050
};
5151
pub use crate::eval::{create_ecx, eval_main, MiriConfig, TerminationInfo};
52-
pub use crate::helpers::EvalContextExt as HelpersEvalContextExt;
52+
pub use crate::helpers::{EvalContextExt as HelpersEvalContextExt, u16vec_to_osstring};
5353
pub use crate::machine::{
5454
AllocExtra, Evaluator, FrameData, MemoryExtra, MiriEvalContext, MiriEvalContextExt,
5555
MiriMemoryKind, NUM_CPUS, PAGE_SIZE, STACK_ADDR, STACK_SIZE,

src/shims/foreign_items/windows.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::*;
22
use crate::rustc_target::abi::LayoutOf;
3+
use crate::helpers::u16vec_to_osstring;
34
use rustc::mir;
45
use rustc::ty::layout::Size;
56
use std::iter;
@@ -44,14 +45,14 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
4445
for &item in this.machine.env_vars.values()? {
4546
let env_var = this.read_os_str_from_target_str(Scalar::from(item))?;
4647
env_vars.push(env_var);
47-
env_vars.push(" ");
48+
env_vars.push(u16vec_to_osstring(vec![0x0000 as u16])?);
4849
}
4950

5051
// Allocate environment block
5152
let tcx = this.tcx;
5253
let env_block_size = env_vars.len() + 1;
5354
let env_block_type = tcx.mk_array(tcx.types.u16, u64::try_from(env_block_size).unwrap());
54-
let env_block_place = this.allocate(this.layout_of(env_block_type)?, MiriMemoryKind::Machine.into());
55+
let env_block_place = this.allocate(this.layout_of(env_block_type)?, MiriMemoryKind::WinHeap.into());
5556

5657
// Store environment variables to environment block
5758
// Final null terminator(block terminator) is pushed by `write_os_str_to_wide_str`
@@ -62,8 +63,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
6263
}
6364

6465
"FreeEnvironmentStringsW" => {
65-
// let old_vars_ptr = this.read_scalar(args[0])?.not_undef()?;
66-
// this.memory.deallocate(this.force_ptr(old_vars_ptr)?, None, MiriMemoryKind::Machine.into())?;
66+
let old_vars_ptr = this.read_scalar(args[0])?.not_undef()?;
67+
this.memory.deallocate(this.force_ptr(old_vars_ptr)?, None, MiriMemoryKind::WinHeap.into())?;
6768
}
6869

6970
// File related shims

0 commit comments

Comments
 (0)