@@ -734,15 +734,19 @@ impl<'a> Iterator for DirBuffIter<'a> {
734734        //   `FileNameLength` bytes) 
735735        let  ( name,  is_directory,  next_entry)  = unsafe  { 
736736            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 
738738            // 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 ( ) ; 
741745            let  name = crate :: slice:: from_raw_parts ( 
742746                ptr:: addr_of!( ( * info) . FileName ) . cast :: < u16 > ( ) , 
743-                 ( * info ) . FileNameLength   as   usize  / size_of :: < u16 > ( ) , 
747+                 length  / size_of :: < u16 > ( ) , 
744748            ) ; 
745-             let  is_directory = ( ( * info ) . FileAttributes  &  c:: FILE_ATTRIBUTE_DIRECTORY )  != 0 ; 
749+             let  is_directory = ( attrs  &  c:: FILE_ATTRIBUTE_DIRECTORY )  != 0 ; 
746750
747751            ( name,  is_directory,  next_entry) 
748752        } ; 
0 commit comments