Skip to content

Commit

Permalink
fix capacity overflows in HeaderMap::reserve
Browse files Browse the repository at this point in the history
  • Loading branch information
seanmonstar committed Nov 26, 2019
1 parent 32f1ae1 commit 81ceb61
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/header/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,8 @@ impl<T> HeaderMap<T> {

if cap > self.indices.len() {
let cap = cap.next_power_of_two();
assert!(cap < MAX_SIZE, "header map reserve over max capacity");
assert!(cap != 0, "header map reserve overflowed");

if self.entries.len() == 0 {
self.mask = cap - 1;
Expand Down
16 changes: 16 additions & 0 deletions tests/header_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,22 @@ fn smoke() {
}
}

#[test]
#[should_panic]
fn reserve_over_capacity() {
// See https://github.com/hyperium/http/issues/352
let mut headers = HeaderMap::<u32>::with_capacity(32);
headers.reserve(50_000); // over MAX_SIZE
}

#[test]
#[should_panic]
fn reserve_overflow() {
// See https://github.com/hyperium/http/issues/352
let mut headers = HeaderMap::<u32>::with_capacity(0);
headers.reserve(std::usize::MAX); // next_power_of_two overflows
}

#[test]
fn drain() {
let mut headers = HeaderMap::new();
Expand Down

0 comments on commit 81ceb61

Please sign in to comment.