Skip to content

Commit f425cdf

Browse files
committed
fix UB in slice related methods
1 parent 612e53a commit f425cdf

File tree

1 file changed

+16
-20
lines changed

1 file changed

+16
-20
lines changed

src/lib.rs

+16-20
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use access::{ReadOnly, ReadWrite, Readable, Writable, WriteOnly};
1616
use core::{
1717
fmt,
1818
marker::PhantomData,
19-
ops::Deref,
20-
ops::{DerefMut, Index, IndexMut},
19+
ops::{Deref, DerefMut, Index, IndexMut},
2120
ptr,
2221
slice::SliceIndex,
2322
};
@@ -514,16 +513,17 @@ where
514513
where
515514
T: Copy,
516515
{
516+
let src = self.reference.deref();
517517
assert_eq!(
518-
self.reference.len(),
518+
src.len(),
519519
dst.len(),
520520
"destination and source slices have different lengths"
521521
);
522522
unsafe {
523523
intrinsics::volatile_copy_nonoverlapping_memory(
524524
dst.as_mut_ptr(),
525-
self.reference.as_ptr(),
526-
self.reference.len(),
525+
src.as_ptr(),
526+
src.len(),
527527
);
528528
}
529529
}
@@ -569,16 +569,17 @@ where
569569
T: Copy,
570570
R: DerefMut,
571571
{
572+
let dest = self.reference.deref_mut();
572573
assert_eq!(
573-
self.reference.len(),
574+
dest.len(),
574575
src.len(),
575576
"destination and source slices have different lengths"
576577
);
577578
unsafe {
578579
intrinsics::volatile_copy_nonoverlapping_memory(
579-
self.reference.as_mut_ptr(),
580+
dest.as_mut_ptr(),
580581
src.as_ptr(),
581-
self.reference.len(),
582+
dest.len(),
582583
);
583584
}
584585
}
@@ -621,22 +622,20 @@ where
621622
T: Copy,
622623
R: DerefMut,
623624
{
625+
let slice = self.reference.deref_mut();
624626
// implementation taken from https://github.com/rust-lang/rust/blob/683d1bcd405727fcc9209f64845bd3b9104878b8/library/core/src/slice/mod.rs#L2726-L2738
625627
let Range {
626628
start: src_start,
627629
end: src_end,
628-
} = range(src, ..self.reference.len());
630+
} = range(src, ..slice.len());
629631
let count = src_end - src_start;
630-
assert!(
631-
dest <= self.reference.len() - count,
632-
"dest is out of bounds"
633-
);
632+
assert!(dest <= slice.len() - count, "dest is out of bounds");
634633
// SAFETY: the conditions for `volatile_copy_memory` have all been checked above,
635634
// as have those for `ptr::add`.
636635
unsafe {
637636
intrinsics::volatile_copy_memory(
638-
self.reference.as_mut_ptr().add(dest),
639-
self.reference.as_ptr().add(src_start),
637+
slice.as_mut_ptr().add(dest),
638+
slice.as_ptr().add(src_start),
640639
count,
641640
);
642641
}
@@ -672,12 +671,9 @@ where
672671
where
673672
R: DerefMut,
674673
{
674+
let dest = self.reference.deref_mut();
675675
unsafe {
676-
intrinsics::volatile_set_memory(
677-
self.reference.as_mut_ptr(),
678-
value,
679-
self.reference.len(),
680-
);
676+
intrinsics::volatile_set_memory(dest.as_mut_ptr(), value, dest.len());
681677
}
682678
}
683679
}

0 commit comments

Comments
 (0)