Skip to content

Commit fe4a158

Browse files
committed
Fail when a vec::reserve is too large
1 parent 648c5e9 commit fe4a158

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/libstd/vec.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,11 @@ impl<T> OwnedVector<T> for ~[T] {
11831183
rustrt::vec_reserve_shared_actual(td, ptr as **raw::VecRepr, n as libc::size_t);
11841184
} else {
11851185
let alloc = n * sys::nonzero_size_of::<T>();
1186-
*ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::<raw::VecRepr>())
1186+
let size = alloc + size_of::<raw::VecRepr>();
1187+
if alloc / sys::nonzero_size_of::<T>() != n || size < alloc {
1188+
fail!("vector size is too large: %u", n);
1189+
}
1190+
*ptr = realloc_raw(*ptr as *mut c_void, size)
11871191
as *mut raw::VecRepr;
11881192
(**ptr).unboxed.alloc = alloc;
11891193
}
@@ -3229,4 +3233,13 @@ mod tests {
32293233
values.mut_slice(2,4).set_memory(0xFF);
32303234
assert_eq!(values, [0xAB, 0xAB, 0xFF, 0xFF, 0xAB]);
32313235
}
3236+
3237+
#[test]
3238+
#[should_fail]
3239+
fn test_overflow_does_not_cause_segfault() {
3240+
let mut v = ~[];
3241+
v.reserve(-1);
3242+
v.push(1);
3243+
v.push(2);
3244+
}
32323245
}

0 commit comments

Comments
 (0)