Skip to content

Commit c0a6b5f

Browse files
committed
Set errno when getcwd fails
1 parent 49275d4 commit c0a6b5f

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/shims/env.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,18 +130,21 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
130130
let size = this.read_scalar(size_op)?.to_usize(&*this.tcx)?;
131131
// If we cannot get the current directory, we return null
132132
// FIXME: Technically we have to set the `errno` global too
133-
if let Ok(cwd) = env::current_dir() {
134-
// It is not clear what happens with non-utf8 paths here
135-
let mut bytes = cwd.display().to_string().into_bytes();
136-
// If the buffer is smaller or equal than the path, we return null.
137-
// FIXME: Technically we have to set the `errno` global too
138-
if (bytes.len() as u64) < size {
139-
// We add a `/0` terminator
140-
bytes.push(0);
141-
// This is ok because the buffer is larger than the path with the null terminator.
142-
this.memory_mut().get_mut(buf.alloc_id)?.write_bytes(tcx, buf, &bytes)?;
143-
return Ok(Scalar::Ptr(buf))
133+
match env::current_dir() {
134+
Ok(cwd) =>{
135+
// It is not clear what happens with non-utf8 paths here
136+
let mut bytes = cwd.display().to_string().into_bytes();
137+
// If the buffer is smaller or equal than the path, we return null.
138+
if (bytes.len() as u64) < size {
139+
// We add a `/0` terminator
140+
bytes.push(0);
141+
// This is ok because the buffer is larger than the path with the null terminator.
142+
this.memory_mut().get_mut(buf.alloc_id)?.write_bytes(tcx, buf, &bytes)?;
143+
return Ok(Scalar::Ptr(buf))
144+
}
145+
this.machine.last_error = 34; // ERANGE
144146
}
147+
Err(e) => this.machine.last_error = e.raw_os_error().unwrap() as u32,
145148
}
146149
Ok(Scalar::ptr_null(&*this.tcx))
147150
}

0 commit comments

Comments
 (0)