@@ -734,15 +734,19 @@ impl<'a> Iterator for DirBuffIter<'a> {
734
734
// `FileNameLength` bytes)
735
735
let ( name, is_directory, next_entry) = unsafe {
736
736
let info = buffer. as_ptr ( ) . cast :: < c:: FILE_ID_BOTH_DIR_INFO > ( ) ;
737
- // Guaranteed to be aligned in documentation for
737
+ // While this is guaranteed to be aligned in documentation for
738
738
// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_both_dir_info
739
- assert ! ( info. is_aligned( ) ) ;
740
- let next_entry = ( * info) . NextEntryOffset as usize ;
739
+ // it does not seem that reality is so kind, and assuming this
740
+ // caused crashes in some cases (https://github.com/rust-lang/rust/issues/104530)
741
+ // presumably, this can be blamed on buggy filesystem drivers, but who knows.
742
+ let next_entry = ptr:: addr_of!( ( * info) . NextEntryOffset ) . read_unaligned ( ) as usize ;
743
+ let length = ptr:: addr_of!( ( * info) . FileNameLength ) . read_unaligned ( ) as usize ;
744
+ let attrs = ptr:: addr_of!( ( * info) . FileAttributes ) . read_unaligned ( ) ;
741
745
let name = crate :: slice:: from_raw_parts (
742
746
ptr:: addr_of!( ( * info) . FileName ) . cast :: < u16 > ( ) ,
743
- ( * info ) . FileNameLength as usize / size_of :: < u16 > ( ) ,
747
+ length / size_of :: < u16 > ( ) ,
744
748
) ;
745
- let is_directory = ( ( * info ) . FileAttributes & c:: FILE_ATTRIBUTE_DIRECTORY ) != 0 ;
749
+ let is_directory = ( attrs & c:: FILE_ATTRIBUTE_DIRECTORY ) != 0 ;
746
750
747
751
( name, is_directory, next_entry)
748
752
} ;
0 commit comments