File tree Expand file tree Collapse file tree 1 file changed +7
-9
lines changed Expand file tree Collapse file tree 1 file changed +7
-9
lines changed Original file line number Diff line number Diff line change @@ -430,7 +430,7 @@ pub unsafe extern "C" fn sys_getdents64(
430
430
return -crate :: errno:: EINVAL as i64 ;
431
431
}
432
432
433
- let limit = dirp as usize + count ;
433
+ const ALIGN_DIRENT : usize = core :: mem :: align_of :: < Dirent64 > ( ) ;
434
434
let mut dirp: * mut Dirent64 = dirp;
435
435
let mut offset: i64 = 0 ;
436
436
let obj = get_object ( fd) ;
@@ -442,18 +442,18 @@ pub unsafe extern "C" fn sys_getdents64(
442
442
|v| {
443
443
for i in v. iter ( ) {
444
444
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 {
446
448
return -crate :: errno:: EINVAL as i64 ;
447
449
}
448
450
449
451
let dir = unsafe { & mut * dirp } ;
450
452
451
453
dir. d_ino = 0 ;
452
454
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 ( ) ;
457
457
dir. d_off = offset;
458
458
459
459
// copy null-terminated filename
@@ -463,9 +463,7 @@ pub unsafe extern "C" fn sys_getdents64(
463
463
s. add ( len) . write_bytes ( 0 , 1 ) ;
464
464
}
465
465
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 } ;
469
467
}
470
468
471
469
offset
You can’t perform that action at this time.
0 commit comments