Skip to content

Commit 7fc94f7

Browse files
hcplAmanieu
authored andcommitted
Fix pointer range calculation in RawIterRange
The bug affected `RawIterRange::split()`, so I added some debug asserts to be safe.
1 parent b69131a commit 7fc94f7

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/raw/mod.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -853,11 +853,16 @@ impl<T> RawIterRange<T> {
853853
///
854854
/// The start offset must be aligned to the group width.
855855
#[inline]
856-
unsafe fn new(ctrl: *const u8, data: *const T, range: Range<usize>) -> RawIterRange<T> {
856+
unsafe fn new(
857+
input_ctrl: *const u8,
858+
input_data: *const T,
859+
range: Range<usize>,
860+
) -> RawIterRange<T> {
857861
debug_assert_eq!(range.start % Group::WIDTH, 0);
858-
let ctrl = ctrl.add(range.start);
859-
let data = data.add(range.start);
860-
let end = ctrl.add(range.end);
862+
let ctrl = input_ctrl.add(range.start);
863+
let data = input_data.add(range.start);
864+
let end = input_ctrl.add(range.end);
865+
debug_assert_eq!(offset_from(end, ctrl), range.end - range.start);
861866
let current_group = Group::load_aligned(ctrl).match_empty_or_deleted().invert();
862867
RawIterRange {
863868
data,
@@ -881,7 +886,10 @@ impl<T> RawIterRange<T> {
881886
debug_assert_eq!(len % (Group::WIDTH * 2), 0);
882887
let mid = len / 2;
883888
let tail = RawIterRange::new(self.ctrl, self.data, mid..len);
889+
debug_assert_eq!(self.data.add(mid), tail.data);
890+
debug_assert_eq!(self.end, tail.end);
884891
self.end = self.ctrl.add(mid);
892+
debug_assert_eq!(self.end, tail.ctrl);
885893
(self, Some(tail))
886894
}
887895
}

0 commit comments

Comments
 (0)