Skip to content

Commit d9c760d

Browse files
committed
Fix UWP and use AlignedReparseBuf in symlink_junction_inner
1 parent 1b8025a commit d9c760d

File tree

1 file changed

+6
-5
lines changed
  • library/std/src/sys/windows

1 file changed

+6
-5
lines changed

library/std/src/sys/windows/fs.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ impl File {
394394
if attr.file_type().is_reparse_point() {
395395
let mut b = AlignedReparseBuf::new([0; c::MAXIMUM_REPARSE_DATA_BUFFER_SIZE]);
396396
if let Ok((_, buf)) = self.reparse_point(&mut b) {
397-
attr.reparse_tag = buf.ReparseTag;
397+
attr.reparse_tag = (*buf).ReparseTag;
398398
}
399399
}
400400
Ok(attr)
@@ -1345,9 +1345,10 @@ fn symlink_junction_inner(original: &Path, junction: &Path) -> io::Result<()> {
13451345
let h = f.as_inner().as_raw_handle();
13461346

13471347
unsafe {
1348-
let mut data = [0u8; c::MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
1349-
let db = data.as_mut_ptr() as *mut c::REPARSE_MOUNTPOINT_DATA_BUFFER;
1350-
let buf = &mut (*db).ReparseTarget as *mut c::WCHAR;
1348+
let mut data = AlignedReparseBuf::new([0u8; c::MAXIMUM_REPARSE_DATA_BUFFER_SIZE]);
1349+
let data_ptr = data.value.as_mut_ptr();
1350+
let db = data_ptr.cast::<c::REPARSE_MOUNTPOINT_DATA_BUFFER>();
1351+
let buf = ptr::addr_of_mut!((*db).ReparseTarget).cast::<c::WCHAR>();
13511352
let mut i = 0;
13521353
// FIXME: this conversion is very hacky
13531354
let v = br"\??\";
@@ -1367,7 +1368,7 @@ fn symlink_junction_inner(original: &Path, junction: &Path) -> io::Result<()> {
13671368
cvt(c::DeviceIoControl(
13681369
h as *mut _,
13691370
c::FSCTL_SET_REPARSE_POINT,
1370-
data.as_ptr() as *mut _,
1371+
data_ptr.cast(),
13711372
(*db).ReparseDataLength + 8,
13721373
ptr::null_mut(),
13731374
0,

0 commit comments

Comments
 (0)