Skip to content

Commit faf7e42

Browse files
authored
BufferMut::zeroed_aligned stores actually allocated length instead of passed length (#7979)
If `length * size_of::<T>` overflows the length of the buffer is wrong --------- Signed-off-by: Robert Kruszewski <github@robertk.io>
1 parent 52e26d1 commit faf7e42

2 files changed

Lines changed: 53 additions & 4 deletions

File tree

vortex-buffer/src/buffer.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,12 +774,33 @@ mod test {
774774
assert_eq!(buf.remaining(), 10);
775775
assert_eq!(buf.chunk(), b"helloworld");
776776

777-
Buf::advance(&mut buf, 5);
777+
buf.advance(5);
778778
assert_eq!(buf.remaining(), 5);
779779
assert_eq!(buf.as_slice(), b"world");
780780
assert_eq!(buf.chunk(), b"world");
781781
}
782782

783+
#[test]
784+
fn buffer_zeroed() {
785+
const LEN: usize = 17;
786+
787+
let buf = Buffer::<u32>::zeroed(LEN);
788+
789+
assert!(buf.is_aligned(Alignment::of::<u32>()));
790+
assert_eq!(buf.as_slice(), &[0; LEN]);
791+
}
792+
793+
#[test]
794+
fn buffer_zeroed_aligned() {
795+
const LEN: usize = 17;
796+
let alignment = Alignment::new(64);
797+
798+
let buf = Buffer::<u32>::zeroed_aligned(LEN, alignment);
799+
800+
assert!(buf.is_aligned(alignment));
801+
assert_eq!(buf.as_slice(), &[0; LEN]);
802+
}
803+
783804
#[test]
784805
fn from_vec() {
785806
let vec = vec![1, 2, 3, 4, 5];

vortex-buffer/src/buffer_mut.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ impl<T> BufferMut<T> {
6868
let mut bytes = BytesMut::zeroed((len * size_of::<T>()) + *alignment);
6969
bytes.advance(bytes.as_ptr().align_offset(*alignment));
7070
unsafe { bytes.set_len(len * size_of::<T>()) };
71+
let actual_len = bytes.len().checked_div(size_of::<T>()).unwrap_or(0);
7172
Self {
7273
bytes,
73-
length: len,
74+
length: actual_len,
7475
alignment,
7576
_marker: Default::default(),
7677
}
@@ -861,7 +862,7 @@ mod test {
861862
assert_eq!(buf.remaining(), 10);
862863
assert_eq!(buf.chunk(), b"helloworld");
863864

864-
Buf::advance(&mut buf, 5);
865+
buf.advance(5);
865866
assert_eq!(buf.remaining(), 5);
866867
assert_eq!(buf.as_slice(), b"world");
867868
assert_eq!(buf.chunk(), b"world");
@@ -872,7 +873,34 @@ mod test {
872873
let mut buf = ByteBufferMut::copy_from("hello".as_bytes());
873874
assert_eq!(BufMut::remaining_mut(&buf), usize::MAX - 5);
874875

875-
BufMut::put_slice(&mut buf, b"world");
876+
buf.put_slice(b"world");
876877
assert_eq!(buf.as_slice(), b"helloworld");
877878
}
879+
880+
#[test]
881+
fn buffer_mut_zeroed() {
882+
const LEN: usize = 17;
883+
884+
let mut buf = BufferMut::<u32>::zeroed(LEN);
885+
886+
assert_eq!(buf.as_ptr().align_offset(*Alignment::of::<u32>()), 0);
887+
assert_eq!(buf.as_slice(), &[0; LEN]);
888+
889+
buf[3] = 7;
890+
assert_eq!(buf.as_slice()[3], 7);
891+
}
892+
893+
#[test]
894+
fn buffer_mut_zeroed_aligned() {
895+
const LEN: usize = 17;
896+
let alignment = Alignment::new(64);
897+
898+
let mut buf = BufferMut::<u32>::zeroed_aligned(LEN, alignment);
899+
900+
assert_eq!(buf.as_ptr().align_offset(*alignment), 0);
901+
assert_eq!(buf.as_slice(), &[0; LEN]);
902+
903+
buf[3] = 7;
904+
assert_eq!(buf.as_slice()[3], 7);
905+
}
878906
}

0 commit comments

Comments
 (0)