Skip to content

Commit f41aaaa

Browse files
committed
Fix potential buffer overflow in insert_many
Fixes servo#252.
1 parent 0b2b4e5 commit f41aaaa

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@ impl<A: Array> SmallVec<A> {
10411041
let mut cur = ptr.add(num_added);
10421042
if num_added >= lower_size_bound {
10431043
// Iterator provided more elements than the hint. Move trailing items again.
1044-
self.reserve(1);
1044+
self.reserve(guard.len + 1);
10451045
let start = self.as_mut_ptr();
10461046
ptr = start.add(index);
10471047
cur = ptr.add(num_added);

src/tests.rs

+15
Original file line numberDiff line numberDiff line change
@@ -905,3 +905,18 @@ fn empty_macro() {
905905
fn zero_size_items() {
906906
SmallVec::<[(); 0]>::new().push(());
907907
}
908+
909+
#[test]
910+
fn test_insert_many_overflow() {
911+
let mut v: SmallVec<[u8; 0]> = SmallVec::new();
912+
913+
// Spill on heap
914+
v.push(123);
915+
916+
// Prepare an iterator with small lower bound
917+
let iter = (0u8..=255).filter(|n| n % 2 == 0);
918+
assert_eq!(iter.size_hint().0, 0);
919+
920+
// Triggering the bug
921+
v.insert_many(0, iter);
922+
}

0 commit comments

Comments
 (0)