Skip to content

Commit b84e7b7

Browse files
committed
Move getentropy handling to a shared location for foreign item implementation
1 parent 7555cbb commit b84e7b7

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/shims/unix/macos/dlsym.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use rustc_middle::mir;
22

33
use log::trace;
44

5+
use super::foreign_items::EvalContextExt as _;
56
use crate::*;
67
use helpers::check_arg_count;
78

@@ -38,10 +39,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
3839
match dlsym {
3940
Dlsym::getentropy => {
4041
let [ptr, len] = check_arg_count(args)?;
41-
let ptr = this.read_pointer(ptr)?;
42-
let len = this.read_target_usize(len)?;
43-
this.gen_random(ptr, len)?;
44-
this.write_null(dest)?;
42+
let result = this.getentropy(ptr, len)?;
43+
this.write_scalar(result, dest)?;
4544
}
4645
}
4746

src/shims/unix/macos/foreign_items.rs

+23
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
109109
this.write_scalar(result, dest)?;
110110
}
111111

112+
// Random generation related shims
113+
"getentropy" => {
114+
let [buf, bufsize] =
115+
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
116+
let result = this.getentropy(buf, bufsize)?;
117+
this.write_scalar(result, dest)?;
118+
}
119+
112120
// Access to command-line arguments
113121
"_NSGetArgc" => {
114122
let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
@@ -198,4 +206,19 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
198206

199207
Ok(EmulateByNameResult::NeedsJumping)
200208
}
209+
210+
fn getentropy(
211+
&mut self,
212+
buffer_op: &OpTy<'tcx, Provenance>,
213+
length_op: &OpTy<'tcx, Provenance>,
214+
) -> InterpResult<'tcx, Scalar<Provenance>> {
215+
let this = self.eval_context_mut();
216+
this.assert_target_os("macos", "getentropy");
217+
218+
let ptr = this.read_pointer(buffer_op)?;
219+
let len = this.read_target_usize(length_op)?;
220+
this.gen_random(ptr, len)?;
221+
222+
Ok(Scalar::from_i32(0)) // KERN_SUCCESS
223+
}
201224
}

0 commit comments

Comments
 (0)