Fix panic resulting from corrupted metadata in `PARTMAP`

next
Sayan Nandan 3 years ago
parent 0b17f7b0e4
commit 0283d91f67
No known key found for this signature in database
GPG Key ID: 8BC07A0A4D41DD52

@ -22,6 +22,7 @@ All changes in this project will be noted in this file.
- (skyd) Respect logging level for all terminal output
- (skyd) Fixed LF check in protocol impl
- (skyd) Fixed new instance detection (now checks if data directory is empty or not)
- (skyd) Fixed panic resulting from corrupted metadata in `PARTMAP`
## Version 0.7.4

@ -65,6 +65,13 @@ impl<K: Eq + Hash, V> Coremap<K, V> {
inner: HashTable::with_capacity(cap),
}
}
pub fn try_with_capacity(cap: usize) -> Result<Self, ()> {
if cap > (isize::MAX as usize) {
Err(())
} else {
Ok(Self::with_capacity(cap))
}
}
/// Returns the total number of key value pairs
pub fn len(&self) -> usize {
self.inner.len()

@ -439,7 +439,8 @@ mod de {
{
let mut rawiter = RawSliceIter::new(data);
let len = rawiter.next_64bit_integer_to_usize()?;
let mut set = HashSet::with_capacity(len);
let mut set = HashSet::new();
set.try_reserve(len).ok()?;
for _ in 0..len {
let lenkey = rawiter.next_64bit_integer_to_usize()?;
if !T::is_expected_len(lenkey) {
@ -469,7 +470,8 @@ mod de {
let mut rawiter = RawSliceIter::new(data);
// so we have 8B. Just unsafe access and transmute it
let len = rawiter.next_64bit_integer_to_usize()?;
let mut set = HashMap::with_capacity(len);
let mut set = HashMap::new();
set.try_reserve(len).ok()?;
for _ in 0..len {
let lenkey = rawiter.next_64bit_integer_to_usize()?;
if !T::is_expected_len(lenkey) {
@ -496,7 +498,7 @@ mod de {
pub fn deserialize_map(data: &[u8]) -> Option<Coremap<Data, Data>> {
let mut rawiter = RawSliceIter::new(data);
let len = rawiter.next_64bit_integer_to_usize()?;
let hm = Coremap::with_capacity(len);
let hm = Coremap::try_with_capacity(len).ok()?;
for _ in 0..len {
let (lenkey, lenval) = rawiter.next_64bit_integer_pair_to_usize()?;
let key = rawiter.next_owned_data(lenkey)?;
@ -517,7 +519,7 @@ mod de {
// get the len
let len = rawiter.next_64bit_integer_to_usize()?;
// allocate a map
let map = Coremap::with_capacity(len);
let map = Coremap::try_with_capacity(len).ok()?;
// now enter a loop
for _ in 0..len {
let keylen = rawiter.next_64bit_integer_to_usize()?;
@ -541,7 +543,8 @@ mod de {
pub fn deserialize_nested_list(mut iter: RawSliceIterBorrowed<'_>) -> Option<Vec<Data>> {
// get list payload len
let list_payload_extent = iter.next_64bit_integer_to_usize()?;
let mut list = Vec::with_capacity(list_payload_extent);
let mut list = Vec::new();
list.try_reserve(list_payload_extent).ok()?;
for _ in 0..list_payload_extent {
// get element size
let list_element_payload_size = iter.next_64bit_integer_to_usize()?;

Loading…
Cancel
Save