X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Ftools%2Fmiri%2Fsrc%2Fshims%2Funix%2Ffs.rs;h=0a26657f57c85cc921db96efbedecdf1fe03842f;hb=c905ef4a6b8d114af8b97ad37f2adb171c917ea6;hp=e048d53a17e0d498630b698711e830ec60b12ac5;hpb=eabc0720a672a70ca4ee2c760a2726f202a7252e;p=rust.git diff --git a/src/tools/miri/src/shims/unix/fs.rs b/src/tools/miri/src/shims/unix/fs.rs index e048d53a17e..0a26657f57c 100644 --- a/src/tools/miri/src/shims/unix/fs.rs +++ b/src/tools/miri/src/shims/unix/fs.rs @@ -278,7 +278,7 @@ pub struct FileHandler { } impl VisitTags for FileHandler { - fn visit_tags(&self, _visit: &mut dyn FnMut(SbTag)) { + fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) { // All our FileDescriptor do not have any tags. } } @@ -490,7 +490,7 @@ fn default() -> DirHandler { } impl VisitTags for DirHandler { - fn visit_tags(&self, visit: &mut dyn FnMut(SbTag)) { + fn visit_tags(&self, visit: &mut dyn FnMut(BorTag)) { let DirHandler { streams, next_id: _ } = self; for dir in streams.values() { @@ -562,17 +562,17 @@ fn open(&mut self, args: &[OpTy<'tcx, Provenance>]) -> InterpResult<'tcx, i32> { let mut mirror = access_mode; let o_append = this.eval_libc_i32("O_APPEND")?; - if flag & o_append != 0 { + if flag & o_append == o_append { options.append(true); mirror |= o_append; } let o_trunc = this.eval_libc_i32("O_TRUNC")?; - if flag & o_trunc != 0 { + if flag & o_trunc == o_trunc { options.truncate(true); mirror |= o_trunc; } let o_creat = this.eval_libc_i32("O_CREAT")?; - if flag & o_creat != 0 { + if flag & o_creat == o_creat { // Get the mode. On macOS, the argument type `mode_t` is actually `u16`, but // C integer promotion rules mean that on the ABI level, it gets passed as `u32` // (see https://github.com/rust-lang/rust/issues/71915). @@ -592,7 +592,7 @@ fn open(&mut self, args: &[OpTy<'tcx, Provenance>]) -> InterpResult<'tcx, i32> { mirror |= o_creat; let o_excl = this.eval_libc_i32("O_EXCL")?; - if flag & o_excl != 0 { + if flag & o_excl == o_excl { mirror |= o_excl; options.create_new(true); } else { @@ -600,11 +600,20 @@ fn open(&mut self, args: &[OpTy<'tcx, Provenance>]) -> InterpResult<'tcx, i32> { } } let o_cloexec = this.eval_libc_i32("O_CLOEXEC")?; - if flag & o_cloexec != 0 { + if flag & o_cloexec == o_cloexec { // We do not need to do anything for this flag because `std` already sets it. // (Technically we do not support *not* setting this flag, but we ignore that.) mirror |= o_cloexec; } + if this.tcx.sess.target.os == "linux" { + let o_tmpfile = this.eval_libc_i32("O_TMPFILE")?; + if flag & o_tmpfile == o_tmpfile { + // if the flag contains `O_TMPFILE` then we return a graceful error + let eopnotsupp = this.eval_libc("EOPNOTSUPP")?; + this.set_last_error(eopnotsupp)?; + return Ok(-1); + } + } // If `flag` is not equal to `mirror`, there is an unsupported option enabled in `flag`, // then we throw an error. if flag != mirror { @@ -1011,7 +1020,8 @@ fn linux_statx( let path = this.read_path_from_c_str(pathname_ptr)?.into_owned(); // See for a discussion of argument sizes. - let empty_path_flag = flags & this.eval_libc("AT_EMPTY_PATH")?.to_i32()? != 0; + let at_ampty_path = this.eval_libc_i32("AT_EMPTY_PATH")?; + let empty_path_flag = flags & at_ampty_path == at_ampty_path; // We only support: // * interpreting `path` as an absolute directory, // * interpreting `path` as a path relative to `dirfd` when the latter is `AT_FDCWD`, or