From 2ee617315c81a7bcf1b3cc33e3f3cbeb1522454d Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 30 Jan 2025 14:04:34 -0800 Subject: [PATCH] Change `listxattr`'s `list` argument to `[u8]`. Change `listxattr`'s `list` argument from [`c_char`] to `[u8]`, since it's more ergonomic to use with APIs like `CStr::from_bytes_with_nul`. Fixes #1218. --- src/backend/libc/fs/syscalls.rs | 35 +++++++++++++++++++++------- src/backend/linux_raw/fs/syscalls.rs | 8 +++---- src/fs/xattr.rs | 6 ++--- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/backend/libc/fs/syscalls.rs b/src/backend/libc/fs/syscalls.rs index 952c96242..84abe6260 100644 --- a/src/backend/libc/fs/syscalls.rs +++ b/src/backend/libc/fs/syscalls.rs @@ -2441,17 +2441,21 @@ pub(crate) fn fsetxattr( } #[cfg(any(apple, linux_kernel, target_os = "hurd"))] -pub(crate) fn listxattr(path: &CStr, list: &mut [ffi::c_char]) -> io::Result { +pub(crate) fn listxattr(path: &CStr, list: &mut [u8]) -> io::Result { #[cfg(not(apple))] unsafe { - ret_usize(c::listxattr(path.as_ptr(), list.as_mut_ptr(), list.len())) + ret_usize(c::listxattr( + path.as_ptr(), + list.as_mut_ptr().cast::(), + list.len(), + )) } #[cfg(apple)] unsafe { ret_usize(c::listxattr( path.as_ptr(), - list.as_mut_ptr(), + list.as_mut_ptr().cast::(), list.len(), 0, )) @@ -2459,17 +2463,21 @@ pub(crate) fn listxattr(path: &CStr, list: &mut [ffi::c_char]) -> io::Result io::Result { +pub(crate) fn llistxattr(path: &CStr, list: &mut [u8]) -> io::Result { #[cfg(not(apple))] unsafe { - ret_usize(c::llistxattr(path.as_ptr(), list.as_mut_ptr(), list.len())) + ret_usize(c::llistxattr( + path.as_ptr(), + list.as_mut_ptr().cast::(), + list.len(), + )) } #[cfg(apple)] unsafe { ret_usize(c::listxattr( path.as_ptr(), - list.as_mut_ptr(), + list.as_mut_ptr().cast::(), list.len(), c::XATTR_NOFOLLOW, )) @@ -2477,17 +2485,26 @@ pub(crate) fn llistxattr(path: &CStr, list: &mut [ffi::c_char]) -> io::Result, list: &mut [ffi::c_char]) -> io::Result { +pub(crate) fn flistxattr(fd: BorrowedFd<'_>, list: &mut [u8]) -> io::Result { let fd = borrowed_fd(fd); #[cfg(not(apple))] unsafe { - ret_usize(c::flistxattr(fd, list.as_mut_ptr(), list.len())) + ret_usize(c::flistxattr( + fd, + list.as_mut_ptr().cast::(), + list.len(), + )) } #[cfg(apple)] unsafe { - ret_usize(c::flistxattr(fd, list.as_mut_ptr(), list.len(), 0)) + ret_usize(c::flistxattr( + fd, + list.as_mut_ptr().cast::(), + list.len(), + 0, + )) } } diff --git a/src/backend/linux_raw/fs/syscalls.rs b/src/backend/linux_raw/fs/syscalls.rs index 3b995a659..67a0a236e 100644 --- a/src/backend/linux_raw/fs/syscalls.rs +++ b/src/backend/linux_raw/fs/syscalls.rs @@ -31,7 +31,7 @@ use crate::backend::conv::{loff_t, loff_t_from_u64, ret_u64}; ))] use crate::fd::AsFd; use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::{self, CStr}; +use crate::ffi::CStr; #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] use crate::fs::CWD; use crate::fs::{ @@ -1628,19 +1628,19 @@ pub(crate) fn fsetxattr( } #[inline] -pub(crate) fn listxattr(path: &CStr, list: &mut [ffi::c_char]) -> io::Result { +pub(crate) fn listxattr(path: &CStr, list: &mut [u8]) -> io::Result { let (list_addr_mut, list_len) = slice_mut(list); unsafe { ret_usize(syscall!(__NR_listxattr, path, list_addr_mut, list_len)) } } #[inline] -pub(crate) fn llistxattr(path: &CStr, list: &mut [ffi::c_char]) -> io::Result { +pub(crate) fn llistxattr(path: &CStr, list: &mut [u8]) -> io::Result { let (list_addr_mut, list_len) = slice_mut(list); unsafe { ret_usize(syscall!(__NR_llistxattr, path, list_addr_mut, list_len)) } } #[inline] -pub(crate) fn flistxattr(fd: BorrowedFd<'_>, list: &mut [ffi::c_char]) -> io::Result { +pub(crate) fn flistxattr(fd: BorrowedFd<'_>, list: &mut [u8]) -> io::Result { let (list_addr_mut, list_len) = slice_mut(list); unsafe { ret_usize(syscall!(__NR_flistxattr, fd, list_addr_mut, list_len)) } } diff --git a/src/fs/xattr.rs b/src/fs/xattr.rs index 4a792c6e1..c6687d0f7 100644 --- a/src/fs/xattr.rs +++ b/src/fs/xattr.rs @@ -137,7 +137,7 @@ pub fn fsetxattr( /// /// [Linux]: https://man7.org/linux/man-pages/man2/listxattr.2.html #[inline] -pub fn listxattr(path: P, list: &mut [ffi::c_char]) -> io::Result { +pub fn listxattr(path: P, list: &mut [u8]) -> io::Result { path.into_with_c_str(|path| backend::fs::syscalls::listxattr(path, list)) } @@ -149,7 +149,7 @@ pub fn listxattr(path: P, list: &mut [ffi::c_char]) -> io::Result< /// /// [Linux]: https://man7.org/linux/man-pages/man2/llistxattr.2.html #[inline] -pub fn llistxattr(path: P, list: &mut [ffi::c_char]) -> io::Result { +pub fn llistxattr(path: P, list: &mut [u8]) -> io::Result { path.into_with_c_str(|path| backend::fs::syscalls::llistxattr(path, list)) } @@ -161,7 +161,7 @@ pub fn llistxattr(path: P, list: &mut [ffi::c_char]) -> io::Result /// /// [Linux]: https://man7.org/linux/man-pages/man2/flistxattr.2.html #[inline] -pub fn flistxattr(fd: Fd, list: &mut [ffi::c_char]) -> io::Result { +pub fn flistxattr(fd: Fd, list: &mut [u8]) -> io::Result { backend::fs::syscalls::flistxattr(fd.as_fd(), list) }