diff --git a/src/helpers.rs b/src/helpers.rs index a765d58bbcf3..c92aa6dfaa7c 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -368,6 +368,19 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx } Ok(()) } + /// Helper function used inside the shims of foreign functions to check that the target + /// platform is `platform`. It returns an error using the `name` of the foreign function if + /// this is not the case. + fn check_platform(&mut self, platform: &str, name: &str) -> InterpResult<'tcx> { + if self.eval_context_mut().tcx.sess.target.target.target_os.to_lowercase() != platform { + throw_unsup_format!( + "`{}` is only available in the `{}` platform", + name, + platform, + ) + } + Ok(()) + } /// Sets the last error variable. fn set_last_error(&mut self, scalar: Scalar) -> InterpResult<'tcx> { diff --git a/src/shims/fs.rs b/src/shims/fs.rs index 2ae215e7204f..42a860780ff8 100644 --- a/src/shims/fs.rs +++ b/src/shims/fs.rs @@ -347,6 +347,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); this.check_no_isolation("stat")?; + this.check_platform("macos", "stat")?; // `stat` always follows symlinks. this.stat_or_lstat(true, path_op, buf_op) } @@ -359,6 +360,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); this.check_no_isolation("lstat")?; + this.check_platform("macos", "lstat")?; this.stat_or_lstat(false, path_op, buf_op) } @@ -370,10 +372,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx let this = self.eval_context_mut(); this.check_no_isolation("fstat")?; - - if this.tcx.sess.target.target.target_os.to_lowercase() != "macos" { - throw_unsup_format!("The `fstat` shim is only available for `macos` targets.") - } + this.check_platform("macos", "fstat")?; let fd = this.read_scalar(fd_op)?.to_i32()?; @@ -392,10 +391,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx ) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); - if this.tcx.sess.target.target.target_os.to_lowercase() != "macos" { - throw_unsup_format!("The `stat` and `lstat` shims are only available for `macos` targets.") - } - let path_scalar = this.read_scalar(path_op)?.not_undef()?; let path: PathBuf = this.read_os_str_from_c_str(path_scalar)?.into(); @@ -417,10 +412,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx let this = self.eval_context_mut(); this.check_no_isolation("statx")?; - - if this.tcx.sess.target.target.target_os.to_lowercase() != "linux" { - throw_unsup_format!("The `statx` shim is only available for `linux` targets.") - } + this.check_platform("linux", "statx")?; let statxbuf_scalar = this.read_scalar(statxbuf_op)?.not_undef()?; let pathname_scalar = this.read_scalar(pathname_op)?.not_undef()?;