@@ -16,17 +16,19 @@ impl EnvVars {
16
16
) {
17
17
if ecx. machine . communicate {
18
18
for ( name, value) in std:: env:: vars ( ) {
19
- let value = alloc_env_value ( value. as_bytes ( ) , ecx. memory_mut ( ) ) ;
20
- ecx. machine . env_vars . map . insert ( name. into_bytes ( ) , value ) ;
19
+ let var_ptr = alloc_env_var ( name . as_bytes ( ) , value. as_bytes ( ) , ecx. memory_mut ( ) ) ;
20
+ ecx. machine . env_vars . map . insert ( name. into_bytes ( ) , var_ptr ) ;
21
21
}
22
22
}
23
23
}
24
24
}
25
25
26
- fn alloc_env_value < ' mir , ' tcx > (
27
- bytes : & [ u8 ] ,
26
+ fn alloc_env_var < ' mir , ' tcx > (
27
+ name : & [ u8 ] ,
28
+ value : & [ u8 ] ,
28
29
memory : & mut Memory < ' mir , ' tcx , Evaluator < ' tcx > > ,
29
30
) -> Pointer < Tag > {
31
+ let bytes = [ name, b"=" , value] . concat ( ) ;
30
32
let tcx = { memory. tcx . tcx } ;
31
33
let length = bytes. len ( ) as u64 ;
32
34
// `+1` for the null terminator.
@@ -57,7 +59,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
57
59
let name_ptr = this. read_scalar ( name_op) ?. not_undef ( ) ?;
58
60
let name = this. memory ( ) . read_c_str ( name_ptr) ?;
59
61
Ok ( match this. machine . env_vars . map . get ( name) {
60
- Some ( & var ) => Scalar :: Ptr ( var ) ,
62
+ Some ( var_ptr ) => Scalar :: Ptr ( var_ptr . offset ( Size :: from_bytes ( name . len ( ) as u64 + 1 ) , this ) ? ) ,
61
63
None => Scalar :: ptr_null ( & * this. tcx ) ,
62
64
} )
63
65
}
@@ -80,8 +82,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
80
82
}
81
83
}
82
84
if let Some ( ( name, value) ) = new {
83
- let value_copy = alloc_env_value ( & value, this. memory_mut ( ) ) ;
84
- if let Some ( var) = this. machine . env_vars . map . insert ( name. to_owned ( ) , value_copy ) {
85
+ let var_ptr = alloc_env_var ( & name , & value, this. memory_mut ( ) ) ;
86
+ if let Some ( var) = this. machine . env_vars . map . insert ( name. to_owned ( ) , var_ptr ) {
85
87
this. memory_mut ( ) . deallocate ( var, None , MiriMemoryKind :: Env . into ( ) ) ?;
86
88
}
87
89
Ok ( 0 )
0 commit comments