Skip to content

Commit 37ead6e

Browse files
committed
Avoid panic in Element::new (replace assert! with ensure!)
1 parent a4d2ea5 commit 37ead6e

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

src/lib.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -550,9 +550,9 @@ impl QueueFile {
550550
ensure!(i32::try_from(len).is_ok(), ElementTooBigSnafu {});
551551

552552
if first_added.is_none() {
553-
first_added = Some(Element::new(pos, len));
553+
first_added = Some(Element::new(pos, len)?);
554554
}
555-
last_added = Some(Element::new(pos, len));
555+
last_added = Some(Element::new(pos, len)?);
556556

557557
self.write_buf.extend(&(len as u32).to_be_bytes());
558558
self.write_buf.extend(elem);
@@ -678,7 +678,7 @@ impl QueueFile {
678678
// Commit the header.
679679
self.write_header(self.file_len(), self.elem_cnt - n, new_first_pos, self.last.pos)?;
680680
self.elem_cnt -= n;
681-
self.first = Element::new(new_first_pos, new_first_len);
681+
self.first = Element::new(new_first_pos, new_first_len)?;
682682

683683
if let Some(cached_index) = cached_index {
684684
self.cached_offsets.drain(..=cached_index);
@@ -855,14 +855,14 @@ impl QueueFile {
855855
self.inner.write(&header.as_ref()[..self.header_len as usize])
856856
}
857857

858-
fn read_element(&mut self, pos: u64) -> io::Result<Element> {
858+
fn read_element(&mut self, pos: u64) -> Result<Element> {
859859
if pos == 0 {
860860
Ok(Element::EMPTY)
861861
} else {
862862
let mut buf: [u8; 4] = [0; Element::HEADER_LENGTH];
863863
self.ring_read(pos, &mut buf)?;
864864

865-
Ok(Element::new(pos, u32::from_be_bytes(buf) as usize))
865+
Element::new(pos, u32::from_be_bytes(buf) as usize)
866866
}
867867
}
868868

@@ -964,7 +964,7 @@ impl QueueFile {
964964
// Commit the expansion.
965965
if self.last.pos < self.first.pos {
966966
let new_last_pos = orig_file_len + self.last.pos - self.header_len;
967-
self.last = Element::new(new_last_pos, self.last.len);
967+
self.last = Element::new(new_last_pos, self.last.len)?;
968968
}
969969

970970
// TODO: cached offsets might be recalculated after transfer
@@ -1189,19 +1189,16 @@ impl Element {
11891189
const EMPTY: Self = Self { pos: 0, len: 0 };
11901190
const HEADER_LENGTH: usize = 4;
11911191

1192-
fn new(pos: u64, len: usize) -> Self {
1193-
assert!(
1194-
i64::try_from(pos).is_ok(),
1195-
"element position must be less than {}",
1196-
i64::max_value()
1197-
);
1198-
assert!(
1199-
i32::try_from(len).is_ok(),
1200-
"element length must be less than {}",
1201-
i32::max_value()
1202-
);
1192+
#[inline]
1193+
fn new(pos: u64, len: usize) -> Result<Self> {
1194+
ensure!(i64::try_from(pos).is_ok(), CorruptedFileSnafu {
1195+
msg: "element position must be less or equal to i64::MAX"
1196+
});
1197+
ensure!(i32::try_from(len).is_ok(), CorruptedFileSnafu {
1198+
msg: "element length must be less or equal to i32::MAX"
1199+
});
12031200

1204-
Self { pos, len }
1201+
Ok(Self { pos, len })
12051202
}
12061203
}
12071204

0 commit comments

Comments
 (0)