From c905ef4a6b8d114af8b97ad37f2adb171c917ea6 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 12 Dec 2022 07:57:17 +0100 Subject: [PATCH] make flag checks reobust against multi-bit flags --- src/tools/miri/src/shims/unix/fs.rs | 15 ++++++++------- src/tools/miri/src/shims/unix/linux/sync.rs | 7 ++++--- src/tools/miri/src/shims/windows/foreign_items.rs | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/tools/miri/src/shims/unix/fs.rs b/src/tools/miri/src/shims/unix/fs.rs index bf99412af65..0a26657f57c 100644 --- a/src/tools/miri/src/shims/unix/fs.rs +++ b/src/tools/miri/src/shims/unix/fs.rs @@ -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,14 +600,14 @@ 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 != 0 { + 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)?; @@ -1020,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 diff --git a/src/tools/miri/src/shims/unix/linux/sync.rs b/src/tools/miri/src/shims/unix/linux/sync.rs index 343232c4bbb..31461e4c9fd 100644 --- a/src/tools/miri/src/shims/unix/linux/sync.rs +++ b/src/tools/miri/src/shims/unix/linux/sync.rs @@ -90,7 +90,8 @@ pub fn futex<'tcx>( let timeout_time = if this.ptr_is_null(timeout.ptr)? { None } else { - if op & futex_realtime != 0 { + let realtime = op & futex_realtime == futex_realtime; + if realtime { this.check_no_isolation( "`futex` syscall with `op=FUTEX_WAIT` and non-null timeout with `FUTEX_CLOCK_REALTIME`", )?; @@ -106,14 +107,14 @@ pub fn futex<'tcx>( }; Some(if wait_bitset { // FUTEX_WAIT_BITSET uses an absolute timestamp. - if op & futex_realtime != 0 { + if realtime { Time::RealTime(SystemTime::UNIX_EPOCH.checked_add(duration).unwrap()) } else { Time::Monotonic(this.machine.clock.anchor().checked_add(duration).unwrap()) } } else { // FUTEX_WAIT uses a relative timestamp. - if op & futex_realtime != 0 { + if realtime { Time::RealTime(SystemTime::now().checked_add(duration).unwrap()) } else { Time::Monotonic(this.machine.clock.now().checked_add(duration).unwrap()) diff --git a/src/tools/miri/src/shims/windows/foreign_items.rs b/src/tools/miri/src/shims/windows/foreign_items.rs index 05ce81b71a4..81af3259688 100644 --- a/src/tools/miri/src/shims/windows/foreign_items.rs +++ b/src/tools/miri/src/shims/windows/foreign_items.rs @@ -76,7 +76,8 @@ fn emulate_foreign_item_by_name( this.read_scalar(handle)?.to_machine_isize(this)?; let flags = this.read_scalar(flags)?.to_u32()?; let size = this.read_scalar(size)?.to_machine_usize(this)?; - let zero_init = (flags & 0x00000008) != 0; // HEAP_ZERO_MEMORY + let heap_zero_memory = 0x00000008; // HEAP_ZERO_MEMORY + let zero_init = (flags & heap_zero_memory) == heap_zero_memory; let res = this.malloc(size, zero_init, MiriMemoryKind::WinHeap)?; this.write_pointer(res, dest)?; } -- 2.44.0