@@ -11,7 +11,7 @@ use crate::slice;
1111use crate :: sync:: Arc ;
1212use crate :: sys:: handle:: Handle ;
1313use crate :: sys:: time:: SystemTime ;
14- use crate :: sys:: { c, cvt, AlignedAs } ;
14+ use crate :: sys:: { c, cvt, Align8 } ;
1515use crate :: sys_common:: { AsInner , FromInner , IntoInner } ;
1616use crate :: thread;
1717
@@ -47,9 +47,6 @@ pub struct ReadDir {
4747 first : Option < c:: WIN32_FIND_DATAW > ,
4848}
4949
50- type AlignedReparseBuf =
51- AlignedAs < c:: REPARSE_DATA_BUFFER , [ u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] > ;
52-
5350struct FindNextFileHandle ( c:: HANDLE ) ;
5451
5552unsafe impl Send for FindNextFileHandle { }
@@ -329,7 +326,7 @@ impl File {
329326 cvt ( c:: GetFileInformationByHandle ( self . handle . as_raw_handle ( ) , & mut info) ) ?;
330327 let mut reparse_tag = 0 ;
331328 if info. dwFileAttributes & c:: FILE_ATTRIBUTE_REPARSE_POINT != 0 {
332- let mut b = AlignedReparseBuf :: new ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
329+ let mut b = Align8 ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
333330 if let Ok ( ( _, buf) ) = self . reparse_point ( & mut b) {
334331 reparse_tag = ( * buf) . ReparseTag ;
335332 }
@@ -392,7 +389,7 @@ impl File {
392389 attr. file_size = info. AllocationSize as u64 ;
393390 attr. number_of_links = Some ( info. NumberOfLinks ) ;
394391 if attr. file_type ( ) . is_reparse_point ( ) {
395- let mut b = AlignedReparseBuf :: new ( [ 0 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
392+ let mut b = Align8 ( [ 0 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
396393 if let Ok ( ( _, buf) ) = self . reparse_point ( & mut b) {
397394 attr. reparse_tag = ( * buf) . ReparseTag ;
398395 }
@@ -466,28 +463,32 @@ impl File {
466463 // avoid narrowing provenance to the actual `REPARSE_DATA_BUFFER`.
467464 fn reparse_point (
468465 & self ,
469- space : & mut AlignedReparseBuf ,
466+ space : & mut Align8 < [ u8 ] > ,
470467 ) -> io:: Result < ( c:: DWORD , * const c:: REPARSE_DATA_BUFFER ) > {
471468 unsafe {
472469 let mut bytes = 0 ;
473470 cvt ( {
471+ // Grab this in advance to avoid it invalidating the pointer
472+ // we get from `space.0.as_mut_ptr()`.
473+ let len = space. 0 . len ( ) ;
474474 c:: DeviceIoControl (
475475 self . handle . as_raw_handle ( ) ,
476476 c:: FSCTL_GET_REPARSE_POINT ,
477477 ptr:: null_mut ( ) ,
478478 0 ,
479- space. value . as_mut_ptr ( ) as * mut _ ,
480- space . value . len ( ) as c:: DWORD ,
479+ space. 0 . as_mut_ptr ( ) . cast ( ) ,
480+ len as c:: DWORD ,
481481 & mut bytes,
482482 ptr:: null_mut ( ) ,
483483 )
484484 } ) ?;
485- Ok ( ( bytes, space. value . as_ptr ( ) . cast :: < c:: REPARSE_DATA_BUFFER > ( ) ) )
485+ const _: ( ) = assert ! ( core:: mem:: align_of:: <c:: REPARSE_DATA_BUFFER >( ) <= 8 ) ;
486+ Ok ( ( bytes, space. 0 . as_ptr ( ) . cast :: < c:: REPARSE_DATA_BUFFER > ( ) ) )
486487 }
487488 }
488489
489490 fn readlink ( & self ) -> io:: Result < PathBuf > {
490- let mut space = AlignedReparseBuf :: new ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
491+ let mut space = Align8 ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
491492 let ( _bytes, buf) = self . reparse_point ( & mut space) ?;
492493 unsafe {
493494 let ( path_buffer, subst_off, subst_len, relative) = match ( * buf) . ReparseTag {
@@ -1345,8 +1346,8 @@ fn symlink_junction_inner(original: &Path, junction: &Path) -> io::Result<()> {
13451346 let h = f. as_inner ( ) . as_raw_handle ( ) ;
13461347
13471348 unsafe {
1348- let mut data = AlignedReparseBuf :: new ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
1349- let data_ptr = data. value . as_mut_ptr ( ) ;
1349+ let mut data = Align8 ( [ 0u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ) ;
1350+ let data_ptr = data. 0 . as_mut_ptr ( ) ;
13501351 let db = data_ptr. cast :: < c:: REPARSE_MOUNTPOINT_DATA_BUFFER > ( ) ;
13511352 let buf = ptr:: addr_of_mut!( ( * db) . ReparseTarget ) . cast :: < c:: WCHAR > ( ) ;
13521353 let mut i = 0 ;
0 commit comments