Fix binary serialization bug (#1907)
* fix compilation and add it to the ci run * no separator? * use quotes and spaces * literal macro and some tests * reproduced in a failing test * fix * literal macro and some tests * reproduced in a failing test * fix
This commit is contained in:
@@ -288,6 +288,9 @@ impl<K, V> BinaryConvertable for BTreeMap<K, V> where K : BinaryConvertable + Or
|
||||
let key = if key_size == 0 {
|
||||
try!(K::from_empty_bytes())
|
||||
} else {
|
||||
if index + key_size > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
try!(K::from_bytes(&buffer[index..index+key_size], length_stack))
|
||||
};
|
||||
index = index + key_size;
|
||||
@@ -299,6 +302,9 @@ impl<K, V> BinaryConvertable for BTreeMap<K, V> where K : BinaryConvertable + Or
|
||||
let val = if val_size == 0 {
|
||||
try!(V::from_empty_bytes())
|
||||
} else {
|
||||
if index + val_size > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
try!(V::from_bytes(&buffer[index..index+val_size], length_stack))
|
||||
};
|
||||
result.insert(key, val);
|
||||
@@ -365,13 +371,16 @@ impl<T> BinaryConvertable for VecDeque<T> where T: BinaryConvertable {
|
||||
try!(T::from_empty_bytes())
|
||||
}
|
||||
else {
|
||||
if index + next_size > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
try!(T::from_bytes(&buffer[index..index+next_size], length_stack))
|
||||
};
|
||||
result.push_back(item);
|
||||
|
||||
index = index + next_size;
|
||||
if index == buffer.len() { break; }
|
||||
if index + next_size > buffer.len() {
|
||||
if index > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
}
|
||||
@@ -388,8 +397,6 @@ impl<T> BinaryConvertable for VecDeque<T> where T: BinaryConvertable {
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
impl<T> BinaryConvertable for Vec<T> where T: BinaryConvertable {
|
||||
fn size(&self) -> usize {
|
||||
match T::len_params() {
|
||||
@@ -433,13 +440,16 @@ impl<T> BinaryConvertable for Vec<T> where T: BinaryConvertable {
|
||||
try!(T::from_empty_bytes())
|
||||
}
|
||||
else {
|
||||
if index + next_size > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
try!(T::from_bytes(&buffer[index..index+next_size], length_stack))
|
||||
};
|
||||
result.push(item);
|
||||
|
||||
index = index + next_size;
|
||||
if index == buffer.len() { break; }
|
||||
if index + next_size > buffer.len() {
|
||||
if index > buffer.len() {
|
||||
return Err(BinaryConvertError::boundaries())
|
||||
}
|
||||
}
|
||||
@@ -1151,3 +1161,17 @@ fn serialize_not_enough_lengths() {
|
||||
other => panic!("Not an missing length param error but: {:?}", other),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vec_of_vecs() {
|
||||
let sample = vec![vec![5u8, 10u8], vec![], vec![9u8, 11u8]];
|
||||
let serialized = serialize(&sample).unwrap();
|
||||
let deserialized = deserialize::<Vec<Vec<u8>>>(&serialized).unwrap();
|
||||
assert_eq!(sample, deserialized);
|
||||
|
||||
// empty
|
||||
let sample: Vec<Vec<u8>> = vec![];
|
||||
let serialized = serialize(&sample).unwrap();
|
||||
let deserialized = deserialize::<Vec<Vec<u8>>>(&serialized).unwrap();
|
||||
assert_eq!(sample, deserialized);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user