Skip to content

Commit 1bdf352

Browse files
committed
revise getdents64 to be compatible to the Linux system call
1 parent fd472c1 commit 1bdf352

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

src/syscalls/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ pub unsafe extern "C" fn sys_getdents64(
430430
return -crate::errno::EINVAL as i64;
431431
}
432432

433-
let limit = dirp as usize + count;
433+
const ALIGN_DIRENT: usize = core::mem::align_of::<Dirent64>();
434434
let mut dirp: *mut Dirent64 = dirp;
435435
let mut offset: i64 = 0;
436436
let obj = get_object(fd);
@@ -442,18 +442,18 @@ pub unsafe extern "C" fn sys_getdents64(
442442
|v| {
443443
for i in v.iter() {
444444
let len = i.name.len();
445-
if dirp as usize + core::mem::size_of::<Dirent64>() + len + 1 >= limit {
445+
let aligned_len = ((core::mem::size_of::<Dirent64>() + len + 1)
446+
+ (ALIGN_DIRENT - 1)) & (!(ALIGN_DIRENT - 1));
447+
if offset as usize + aligned_len >= count {
446448
return -crate::errno::EINVAL as i64;
447449
}
448450

449451
let dir = unsafe { &mut *dirp };
450452

451453
dir.d_ino = 0;
452454
dir.d_type = 0;
453-
dir.d_reclen = (core::mem::size_of::<Dirent64>() + len + 1)
454-
.try_into()
455-
.unwrap();
456-
offset += i64::from(dir.d_reclen);
455+
dir.d_reclen = aligned_len.try_into().unwrap();
456+
offset += i64::try_from(aligned_len).unwrap();
457457
dir.d_off = offset;
458458

459459
// copy null-terminated filename
@@ -463,9 +463,7 @@ pub unsafe extern "C" fn sys_getdents64(
463463
s.add(len).write_bytes(0, 1);
464464
}
465465

466-
dirp = unsafe {
467-
(dirp as *mut u8).add(dir.d_reclen as usize) as *mut Dirent64
468-
};
466+
dirp = unsafe { (dirp as *mut u8).add(aligned_len) as *mut Dirent64 };
469467
}
470468

471469
offset

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy