From a5fb07443acfceff597b5783c38059c11bd79a49 Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 15:08:15 +0800 Subject: [PATCH 1/6] refactor: change name arg of memfd_create() to &NixPath --- changelog/2431.changed.md | 1 + src/sys/memfd.rs | 20 ++++++++++++-------- test/sys/mod.rs | 3 +++ test/sys/test_memfd.rs | 22 ++++++++++++++++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 changelog/2431.changed.md create mode 100644 test/sys/test_memfd.rs diff --git a/changelog/2431.changed.md b/changelog/2431.changed.md new file mode 100644 index 0000000000..a1ddf7b702 --- /dev/null +++ b/changelog/2431.changed.md @@ -0,0 +1 @@ +Change the type of the `name` argument of `memfd_create()` from `&CStr` to `(name: &P)` diff --git a/src/sys/memfd.rs b/src/sys/memfd.rs index 22ee5fc5b7..02afdfb7c8 100644 --- a/src/sys/memfd.rs +++ b/src/sys/memfd.rs @@ -4,8 +4,7 @@ use cfg_if::cfg_if; use std::os::unix::io::{FromRawFd, OwnedFd, RawFd}; use crate::errno::Errno; -use crate::Result; -use std::ffi::CStr; +use crate::{NixPath, Result}; libc_bitflags!( /// Options that change the behavior of [`memfd_create`]. @@ -84,9 +83,13 @@ libc_bitflags!( /// /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html #[inline] // Delays codegen, preventing linker errors with dylibs and --no-allow-shlib-undefined -pub fn memfd_create(name: &CStr, flags: MemFdCreateFlag) -> Result { - let res = unsafe { - cfg_if! { +pub fn memfd_create( + name: &P, + flags: MemFdCreateFlag, +) -> Result { + let res = name.with_nix_path(|cstr| { + unsafe { + cfg_if! { if #[cfg(all( // Android does not have a memfd_create symbol not(target_os = "android"), @@ -97,12 +100,13 @@ pub fn memfd_create(name: &CStr, flags: MemFdCreateFlag) -> Result { target_env = "musl", )))] { - libc::memfd_create(name.as_ptr(), flags.bits()) + libc::memfd_create(cstr.as_ptr(), flags.bits()) } else { - libc::syscall(libc::SYS_memfd_create, name.as_ptr(), flags.bits()) + libc::syscall(libc::SYS_memfd_create, cstr.as_ptr(), flags.bits()) } } - }; + } + })?; Errno::result(res).map(|r| unsafe { OwnedFd::from_raw_fd(r as RawFd) }) } diff --git a/test/sys/mod.rs b/test/sys/mod.rs index fb3f6be0e5..26805c239f 100644 --- a/test/sys/mod.rs +++ b/test/sys/mod.rs @@ -82,3 +82,6 @@ mod test_statfs; target_os = "haiku" )))] mod test_resource; + +#[cfg(any(linux_android, target_os = "freebsd"))] +mod test_memfd; \ No newline at end of file diff --git a/test/sys/test_memfd.rs b/test/sys/test_memfd.rs new file mode 100644 index 0000000000..09ea344992 --- /dev/null +++ b/test/sys/test_memfd.rs @@ -0,0 +1,22 @@ +use nix::sys::memfd::memfd_create; +use nix::sys::memfd::MemFdCreateFlag; +use nix::unistd::lseek; +use nix::unistd::read; +use nix::unistd::{write, Whence}; +use std::os::fd::{AsFd, AsRawFd}; + +#[test] +fn test_memfd_create() { + let fd = + memfd_create("test_memfd_create_name", MemFdCreateFlag::MFD_CLOEXEC) + .unwrap(); + let contents = b"hello"; + assert_eq!(write(fd.as_fd(), contents).unwrap(), 5); + + lseek(fd.as_raw_fd(), 0, Whence::SeekSet).unwrap(); + + let mut buf = vec![0_u8; contents.len()]; + assert_eq!(read(fd.as_raw_fd(), &mut buf).unwrap(), 5); + + assert_eq!(contents, buf.as_slice()); +} From 6c5ae8609f516dcdd37917833742f460ce18817b Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 15:22:49 +0800 Subject: [PATCH 2/6] style: format test/sys/mod.rs --- test/sys/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/sys/mod.rs b/test/sys/mod.rs index 26805c239f..c3c30defad 100644 --- a/test/sys/mod.rs +++ b/test/sys/mod.rs @@ -84,4 +84,4 @@ mod test_statfs; mod test_resource; #[cfg(any(linux_android, target_os = "freebsd"))] -mod test_memfd; \ No newline at end of file +mod test_memfd; From aee31a08c52fa74e4a00119f3f29e09843d69385 Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 15:40:22 +0800 Subject: [PATCH 3/6] disable test and see if this symbol is still needed for build --- test/sys/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sys/mod.rs b/test/sys/mod.rs index c3c30defad..4b9c0fdbce 100644 --- a/test/sys/mod.rs +++ b/test/sys/mod.rs @@ -83,5 +83,5 @@ mod test_statfs; )))] mod test_resource; -#[cfg(any(linux_android, target_os = "freebsd"))] -mod test_memfd; +// #[cfg(any(linux_android, target_os = "freebsd"))] +// mod test_memfd; From 2ee04f2146bda0c262b47b7c311a8546ceda0f59 Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 15:52:51 +0800 Subject: [PATCH 4/6] test: disable test under QEMU since symbol is unavailable --- test/sys/mod.rs | 4 ++-- test/sys/test_memfd.rs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/sys/mod.rs b/test/sys/mod.rs index 4b9c0fdbce..c3c30defad 100644 --- a/test/sys/mod.rs +++ b/test/sys/mod.rs @@ -83,5 +83,5 @@ mod test_statfs; )))] mod test_resource; -// #[cfg(any(linux_android, target_os = "freebsd"))] -// mod test_memfd; +#[cfg(any(linux_android, target_os = "freebsd"))] +mod test_memfd; diff --git a/test/sys/test_memfd.rs b/test/sys/test_memfd.rs index 09ea344992..13c5167c4d 100644 --- a/test/sys/test_memfd.rs +++ b/test/sys/test_memfd.rs @@ -6,6 +6,8 @@ use nix::unistd::{write, Whence}; use std::os::fd::{AsFd, AsRawFd}; #[test] +// Looks like symbol `memfd_create()` is unavailable: https://github.com/nix-rust/nix/actions/runs/9427112650/job/25970870477 +#[cfg_attr(qemu, ignore)] fn test_memfd_create() { let fd = memfd_create("test_memfd_create_name", MemFdCreateFlag::MFD_CLOEXEC) From 57f866f3a2c021908eef6662534d249bfbafa484 Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 16:05:43 +0800 Subject: [PATCH 5/6] test: move imports to function body --- test/sys/test_memfd.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/sys/test_memfd.rs b/test/sys/test_memfd.rs index 13c5167c4d..6f5280a008 100644 --- a/test/sys/test_memfd.rs +++ b/test/sys/test_memfd.rs @@ -1,14 +1,14 @@ -use nix::sys::memfd::memfd_create; -use nix::sys::memfd::MemFdCreateFlag; -use nix::unistd::lseek; -use nix::unistd::read; -use nix::unistd::{write, Whence}; -use std::os::fd::{AsFd, AsRawFd}; - #[test] // Looks like symbol `memfd_create()` is unavailable: https://github.com/nix-rust/nix/actions/runs/9427112650/job/25970870477 #[cfg_attr(qemu, ignore)] fn test_memfd_create() { + use nix::sys::memfd::memfd_create; + use nix::sys::memfd::MemFdCreateFlag; + use nix::unistd::lseek; + use nix::unistd::read; + use nix::unistd::{write, Whence}; + use std::os::fd::{AsFd, AsRawFd}; + let fd = memfd_create("test_memfd_create_name", MemFdCreateFlag::MFD_CLOEXEC) .unwrap(); From 678a06fa8785afea3990b7a8ee21657cddbb3bc4 Mon Sep 17 00:00:00 2001 From: Steve Lau Date: Sat, 8 Jun 2024 16:27:21 +0800 Subject: [PATCH 6/6] test: remove the test --- test/sys/mod.rs | 3 --- test/sys/test_memfd.rs | 24 ------------------------ 2 files changed, 27 deletions(-) delete mode 100644 test/sys/test_memfd.rs diff --git a/test/sys/mod.rs b/test/sys/mod.rs index c3c30defad..fb3f6be0e5 100644 --- a/test/sys/mod.rs +++ b/test/sys/mod.rs @@ -82,6 +82,3 @@ mod test_statfs; target_os = "haiku" )))] mod test_resource; - -#[cfg(any(linux_android, target_os = "freebsd"))] -mod test_memfd; diff --git a/test/sys/test_memfd.rs b/test/sys/test_memfd.rs deleted file mode 100644 index 6f5280a008..0000000000 --- a/test/sys/test_memfd.rs +++ /dev/null @@ -1,24 +0,0 @@ -#[test] -// Looks like symbol `memfd_create()` is unavailable: https://github.com/nix-rust/nix/actions/runs/9427112650/job/25970870477 -#[cfg_attr(qemu, ignore)] -fn test_memfd_create() { - use nix::sys::memfd::memfd_create; - use nix::sys::memfd::MemFdCreateFlag; - use nix::unistd::lseek; - use nix::unistd::read; - use nix::unistd::{write, Whence}; - use std::os::fd::{AsFd, AsRawFd}; - - let fd = - memfd_create("test_memfd_create_name", MemFdCreateFlag::MFD_CLOEXEC) - .unwrap(); - let contents = b"hello"; - assert_eq!(write(fd.as_fd(), contents).unwrap(), 5); - - lseek(fd.as_raw_fd(), 0, Whence::SeekSet).unwrap(); - - let mut buf = vec![0_u8; contents.len()]; - assert_eq!(read(fd.as_raw_fd(), &mut buf).unwrap(), 5); - - assert_eq!(contents, buf.as_slice()); -}