diff --git a/src/shims/unix/fs.rs b/src/shims/unix/fs.rs index 3fdf82ebc6..1420279247 100644 --- a/src/shims/unix/fs.rs +++ b/src/shims/unix/fs.rs @@ -1694,7 +1694,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx fn isatty(&mut self, miri_fd: &OpTy<'tcx, Tag>) -> InterpResult<'tcx, i32> { let this = self.eval_context_mut(); #[cfg(unix)] - { + if matches!(this.machine.isolated_op, IsolatedOp::Allow) { let miri_fd = this.read_scalar(miri_fd)?.to_i32()?; if let Some(host_fd) = this.machine.file_handler.handles.get(&miri_fd).and_then(|fd| fd.as_unix_host_fd()) @@ -1714,7 +1714,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx } } // We are attemping to use a Unix interface on a non-Unix platform, or we are on a Unix - // platform and the passed file descriptor is not open. + // platform and the passed file descriptor is not open, or isolation is enabled // FIXME: It should be possible to emulate this at least on Windows by using // GetConsoleMode. let enotty = this.eval_libc("ENOTTY")?; diff --git a/tests/pass/libc.rs b/tests/pass/libc.rs index 6da5279270..ea3848a974 100644 --- a/tests/pass/libc.rs +++ b/tests/pass/libc.rs @@ -1,11 +1,12 @@ //@ignore-windows: No libc on Windows //@compile-flags: -Zmiri-disable-isolation - #![feature(rustc_private)] +use std::fs::{remove_file, File}; +use std::os::unix::io::AsRawFd; + extern crate libc; -#[cfg(any(target_os = "linux", target_os = "freebsd"))] fn tmp() -> std::path::PathBuf { std::env::var("MIRI_TEMP") .map(std::path::PathBuf::from) @@ -15,9 +16,7 @@ fn tmp() -> std::path::PathBuf { #[cfg(any(target_os = "linux", target_os = "freebsd"))] fn test_posix_fadvise() { use std::convert::TryInto; - use std::fs::{remove_file, File}; use std::io::Write; - use std::os::unix::io::AsRawFd; let path = tmp().join("miri_test_libc_posix_fadvise.txt"); // Cleanup before test @@ -44,9 +43,7 @@ fn test_posix_fadvise() { #[cfg(any(target_os = "linux"))] fn test_sync_file_range() { - use std::fs::{remove_file, File}; use std::io::Write; - use std::os::unix::io::AsRawFd; let path = tmp().join("miri_test_libc_sync_file_range.txt"); // Cleanup before test. @@ -319,6 +316,19 @@ fn test_isatty() { libc::isatty(libc::STDIN_FILENO); libc::isatty(libc::STDOUT_FILENO); libc::isatty(libc::STDERR_FILENO); + + // But when we open a file, it is definitely not a TTY. + let path = tmp().join("notatty.txt"); + // Cleanup before test. + remove_file(&path).ok(); + let file = File::create(&path).unwrap(); + + assert_eq!(libc::isatty(file.as_raw_fd()), 0); + assert_eq!(std::io::Error::last_os_error().raw_os_error().unwrap(), libc::ENOTTY); + + // Cleanup after test. + drop(file); + remove_file(&path).unwrap(); } }