@@ -658,18 +658,18 @@ impl File {
658
658
659
659
/// A buffer for holding directory entries.
660
660
struct DirBuff {
661
- buffer : Vec < u8 > ,
661
+ buffer : Box < Align8 < [ u8 ; Self :: BUFFER_SIZE ] > > ,
662
662
}
663
663
impl DirBuff {
664
+ const BUFFER_SIZE : usize = 1024 ;
664
665
fn new ( ) -> Self {
665
- const BUFFER_SIZE : usize = 1024 ;
666
- Self { buffer : vec ! [ 0_u8 ; BUFFER_SIZE ] }
666
+ Self { buffer : Box :: new ( Align8 ( [ 0u8 ; Self :: BUFFER_SIZE ] ) ) }
667
667
}
668
668
fn capacity ( & self ) -> usize {
669
- self . buffer . len ( )
669
+ self . buffer . 0 . len ( )
670
670
}
671
671
fn as_mut_ptr ( & mut self ) -> * mut u8 {
672
- self . buffer . as_mut_ptr ( ) . cast ( )
672
+ self . buffer . 0 . as_mut_ptr ( ) . cast ( )
673
673
}
674
674
/// Returns a `DirBuffIter`.
675
675
fn iter ( & self ) -> DirBuffIter < ' _ > {
@@ -678,7 +678,7 @@ impl DirBuff {
678
678
}
679
679
impl AsRef < [ u8 ] > for DirBuff {
680
680
fn as_ref ( & self ) -> & [ u8 ] {
681
- & self . buffer
681
+ & self . buffer . 0
682
682
}
683
683
}
684
684
@@ -706,9 +706,12 @@ impl<'a> Iterator for DirBuffIter<'a> {
706
706
// used to get the file name slice.
707
707
let ( name, is_directory, next_entry) = unsafe {
708
708
let info = buffer. as_ptr ( ) . cast :: < c:: FILE_ID_BOTH_DIR_INFO > ( ) ;
709
+ // Guaranteed to be aligned in documentation for
710
+ // https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_both_dir_info
711
+ assert ! ( info. is_aligned( ) ) ;
709
712
let next_entry = ( * info) . NextEntryOffset as usize ;
710
713
let name = crate :: slice:: from_raw_parts (
711
- ( * info) . FileName . as_ptr ( ) . cast :: < u16 > ( ) ,
714
+ ptr :: addr_of! ( ( * info) . FileName ) . cast :: < u16 > ( ) ,
712
715
( * info) . FileNameLength as usize / size_of :: < u16 > ( ) ,
713
716
) ;
714
717
let is_directory = ( ( * info) . FileAttributes & c:: FILE_ATTRIBUTE_DIRECTORY ) != 0 ;
0 commit comments