11use std:: collections:: HashMap ;
2+ use std:: env;
23
34use rustc:: ty:: layout:: { Size } ;
45use rustc_mir:: interpret:: { Pointer , Memory } ;
@@ -21,7 +22,7 @@ impl EnvVars {
2122 excluded_env_vars. push ( "TERM" . to_owned ( ) ) ;
2223
2324 if ecx. machine . communicate {
24- for ( name, value) in std :: env:: vars ( ) {
25+ for ( name, value) in env:: vars ( ) {
2526 if !excluded_env_vars. contains ( & name) {
2627 let var_ptr = alloc_env_var ( name. as_bytes ( ) , value. as_bytes ( ) , ecx. memory_mut ( ) ) ;
2728 ecx. machine . env_vars . map . insert ( name. into_bytes ( ) , var_ptr) ;
@@ -111,4 +112,29 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
111112 Ok ( -1 )
112113 }
113114 }
115+
116+ fn getcwd (
117+ & mut self ,
118+ buf_op : OpTy < ' tcx , Tag > ,
119+ size_op : OpTy < ' tcx , Tag > ,
120+ ) -> InterpResult < ' tcx , Scalar < Tag > > {
121+ let this = self . eval_context_mut ( ) ;
122+ let tcx = & { this. tcx . tcx } ;
123+
124+ let buf = this. force_ptr ( this. read_scalar ( buf_op) ?. not_undef ( ) ?) ?;
125+ let size = this. read_scalar ( size_op) ?. to_usize ( & * this. tcx ) ?;
126+ // If we cannot get the current directory, we return null
127+ if let Ok ( cwd) = env:: current_dir ( ) {
128+ // It is not clear what happens with non-utf8 paths here
129+ let mut bytes = cwd. display ( ) . to_string ( ) . into_bytes ( ) ;
130+ // If the buffer is smaller than the path, we return null
131+ if bytes. len ( ) as u64 <= size {
132+ // We need `size` bytes exactly
133+ bytes. resize ( size as usize , 0 ) ;
134+ this. memory_mut ( ) . get_mut ( buf. alloc_id ) ?. write_bytes ( tcx, buf, & bytes) ?;
135+ return Ok ( Scalar :: Ptr ( buf) )
136+ }
137+ }
138+ Ok ( Scalar :: ptr_null ( & * this. tcx ) )
139+ }
114140}
0 commit comments