Skip to content

Commit 7175def

Browse files
authored
Don't set O_LARGEFILE on openat2 when O_PATH is set. (#703)
Linux appears to reject `O_LARGEFILE` with `O_PATH` in `openat2`, so avoid that combination.
1 parent 05f2738 commit 7175def

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

src/backend/linux_raw/fs/syscalls.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,15 @@ pub(crate) fn openat(
7878
pub(crate) fn openat2(
7979
dirfd: BorrowedFd<'_>,
8080
path: &CStr,
81-
flags: OFlags,
81+
mut flags: OFlags,
8282
mode: Mode,
8383
resolve: ResolveFlags,
8484
) -> io::Result<OwnedFd> {
85-
// Always enable support for large files.
86-
let flags = flags | OFlags::from_bits_retain(c::O_LARGEFILE);
85+
// Enable support for large files, but not with `O_PATH` because
86+
// `openat2` doesn't like those flags together.
87+
if !flags.contains(OFlags::PATH) {
88+
flags = flags | OFlags::from_bits_retain(c::O_LARGEFILE);
89+
}
8790

8891
unsafe {
8992
ret_owned_fd(syscall_readonly!(

tests/fs/openat2.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ fn test_openat2() {
7575
)
7676
.unwrap_err();
7777

78+
// Test with `O_PATH`.
79+
let _ = openat2_more(
80+
&dir,
81+
"test.txt",
82+
OFlags::RDONLY | OFlags::CLOEXEC | OFlags::PATH,
83+
Mode::empty(),
84+
ResolveFlags::empty(),
85+
)
86+
.unwrap();
87+
7888
// Test `NO_MAGICLINKS`.
7989
let test = openat2_more(
8090
&dir,

0 commit comments

Comments
 (0)