diff --git a/src/fs.rs b/src/fs.rs index 75287c761..698e879d6 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -326,9 +326,19 @@ fn update_metadata(old_file: &File, new_file: &File) { // only be updated once every 10 milliseconds. #[cfg(any(target_os = "linux", target_os = "android"))] { - let mut times: [libc::timespec; 2] = unsafe { std::mem::zeroed() }; - times[0].tv_nsec = libc::UTIME_OMIT; // don't change atime - if unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, &mut times[1]) } == 0 { + use libc::timespec; + let mut time = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + if unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, &mut time) } == 0 { + let times = [ + timespec { + tv_sec: 0, + tv_nsec: libc::UTIME_OMIT, // don't change atime, + }, + time, + ]; unsafe { // This accesses both times[0] and times[1]. Check `utimensat(2)` for details. libc::futimens(new_file.as_raw_fd(), ×[0]); diff --git a/src/topic_monitor.rs b/src/topic_monitor.rs index 4b8c6cae1..e334b9112 100644 --- a/src/topic_monitor.rs +++ b/src/topic_monitor.rs @@ -28,6 +28,7 @@ use nix::errno::Errno; use nix::unistd; use std::cell::Cell; +use std::mem::MaybeUninit; use std::os::fd::AsRawFd as _; use std::sync::atomic::{AtomicU8, Ordering}; use std::sync::{Condvar, Mutex, MutexGuard}; @@ -172,14 +173,12 @@ pub fn new() -> BinarySemaphore { // On BSD sem_init uses a file descriptor under the hood which doesn't get CLOEXEC (see #7304). // So use fast semaphores on Linux only. #[cfg(target_os = "linux")] - { - // sem_t does not have an initializer in Rust so we use zeroed(). - let sem = Box::pin(UnsafeCell::new(unsafe { std::mem::zeroed() })); - - let res = unsafe { libc::sem_init(sem.get(), 0, 0) }; - if res == 0 { - return Self::Semaphore(sem); - } + if let Some(sem) = { + let mut sem = MaybeUninit::uninit(); + let res = unsafe { libc::sem_init(sem.as_mut_ptr(), 0, 0) }; + (res == 0).then_some(unsafe { sem.assume_init() }) + } { + return Self::Semaphore(Box::pin(UnsafeCell::new(sem))); } let pipes = fds::make_autoclose_pipes().expect("Failed to make pubsub pipes"); diff --git a/src/wutil/dir_iter.rs b/src/wutil/dir_iter.rs index 0fd6c6a7c..d0476874d 100644 --- a/src/wutil/dir_iter.rs +++ b/src/wutil/dir_iter.rs @@ -83,7 +83,7 @@ pub fn dev_inode(&self) -> Option { // Reset our fields. fn reset(&mut self) { self.name.clear(); - self.inode = unsafe { std::mem::zeroed() }; + self.inode = 0; self.typ.set(None); self.dev_inode.set(None); }