@@ -11,7 +11,7 @@ use crate::slice;
11
11
use crate :: sync:: Arc ;
12
12
use crate :: sys:: handle:: Handle ;
13
13
use crate :: sys:: time:: SystemTime ;
14
- use crate :: sys:: { c, cvt, AlignedAs } ;
14
+ use crate :: sys:: { c, cvt, Align8 } ;
15
15
use crate :: sys_common:: { AsInner , FromInner , IntoInner } ;
16
16
use crate :: thread;
17
17
@@ -47,9 +47,6 @@ pub struct ReadDir {
47
47
first : Option < c:: WIN32_FIND_DATAW > ,
48
48
}
49
49
50
- type AlignedReparseBuf =
51
- AlignedAs < c:: REPARSE_DATA_BUFFER , [ u8 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] > ;
52
-
53
50
struct FindNextFileHandle ( c:: HANDLE ) ;
54
51
55
52
unsafe impl Send for FindNextFileHandle { }
@@ -329,7 +326,7 @@ impl File {
329
326
cvt ( c:: GetFileInformationByHandle ( self . handle . as_raw_handle ( ) , & mut info) ) ?;
330
327
let mut reparse_tag = 0 ;
331
328
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 ] ) ;
333
330
if let Ok ( ( _, buf) ) = self . reparse_point ( & mut b) {
334
331
reparse_tag = ( * buf) . ReparseTag ;
335
332
}
@@ -392,7 +389,7 @@ impl File {
392
389
attr. file_size = info. AllocationSize as u64 ;
393
390
attr. number_of_links = Some ( info. NumberOfLinks ) ;
394
391
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 ] ) ;
396
393
if let Ok ( ( _, buf) ) = self . reparse_point ( & mut b) {
397
394
attr. reparse_tag = ( * buf) . ReparseTag ;
398
395
}
@@ -466,28 +463,32 @@ impl File {
466
463
// avoid narrowing provenance to the actual `REPARSE_DATA_BUFFER`.
467
464
fn reparse_point (
468
465
& self ,
469
- space : & mut AlignedReparseBuf ,
466
+ space : & mut Align8 < [ u8 ] > ,
470
467
) -> io:: Result < ( c:: DWORD , * const c:: REPARSE_DATA_BUFFER ) > {
471
468
unsafe {
472
469
let mut bytes = 0 ;
473
470
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 ( ) ;
474
474
c:: DeviceIoControl (
475
475
self . handle . as_raw_handle ( ) ,
476
476
c:: FSCTL_GET_REPARSE_POINT ,
477
477
ptr:: null_mut ( ) ,
478
478
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 ,
481
481
& mut bytes,
482
482
ptr:: null_mut ( ) ,
483
483
)
484
484
} ) ?;
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 > ( ) ) )
486
487
}
487
488
}
488
489
489
490
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 ] ) ;
491
492
let ( _bytes, buf) = self . reparse_point ( & mut space) ?;
492
493
unsafe {
493
494
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<()> {
1345
1346
let h = f. as_inner ( ) . as_raw_handle ( ) ;
1346
1347
1347
1348
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 ( ) ;
1350
1351
let db = data_ptr. cast :: < c:: REPARSE_MOUNTPOINT_DATA_BUFFER > ( ) ;
1351
1352
let buf = ptr:: addr_of_mut!( ( * db) . ReparseTarget ) . cast :: < c:: WCHAR > ( ) ;
1352
1353
let mut i = 0 ;
0 commit comments