Skip to content

Commit 48eeb83

Browse files
authored
Pass null instead of empty slices to getxattr and fgetxattr on macos (#1045)
fixes the remainder of #957 fixes Stebalien/xattr#57
1 parent fa21a6d commit 48eeb83

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

src/backend/libc/fs/syscalls.rs

+36-18
Original file line numberDiff line numberDiff line change
@@ -2254,15 +2254,24 @@ pub(crate) fn getxattr(path: &CStr, name: &CStr, value: &mut [u8]) -> io::Result
22542254
}
22552255

22562256
#[cfg(apple)]
2257-
unsafe {
2258-
ret_usize(c::getxattr(
2259-
path.as_ptr(),
2260-
name.as_ptr(),
2261-
value_ptr.cast::<c::c_void>(),
2262-
value.len(),
2263-
0,
2264-
0,
2265-
))
2257+
{
2258+
// Passing an empty to slice to getxattr leads to ERANGE on macOS. Pass null
2259+
// instead.
2260+
let ptr = if value.is_empty() {
2261+
core::ptr::null_mut()
2262+
} else {
2263+
value_ptr.cast::<c::c_void>()
2264+
};
2265+
unsafe {
2266+
ret_usize(c::getxattr(
2267+
path.as_ptr(),
2268+
name.as_ptr(),
2269+
ptr,
2270+
value.len(),
2271+
0,
2272+
0,
2273+
))
2274+
}
22662275
}
22672276
}
22682277

@@ -2318,15 +2327,24 @@ pub(crate) fn fgetxattr(fd: BorrowedFd<'_>, name: &CStr, value: &mut [u8]) -> io
23182327
}
23192328

23202329
#[cfg(apple)]
2321-
unsafe {
2322-
ret_usize(c::fgetxattr(
2323-
borrowed_fd(fd),
2324-
name.as_ptr(),
2325-
value_ptr.cast::<c::c_void>(),
2326-
value.len(),
2327-
0,
2328-
0,
2329-
))
2330+
{
2331+
// Passing an empty to slice to getxattr leads to ERANGE on macOS. Pass null
2332+
// instead.
2333+
let ptr = if value.is_empty() {
2334+
core::ptr::null_mut()
2335+
} else {
2336+
value_ptr.cast::<c::c_void>()
2337+
};
2338+
unsafe {
2339+
ret_usize(c::fgetxattr(
2340+
borrowed_fd(fd),
2341+
name.as_ptr(),
2342+
ptr,
2343+
value.len(),
2344+
0,
2345+
0,
2346+
))
2347+
}
23302348
}
23312349
}
23322350

0 commit comments

Comments
 (0)