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:
Nikolay Volf
2016-08-10 17:50:23 +03:00
committed by Gav Wood
parent 464516d01d
commit c32244ea4a
3 changed files with 152 additions and 18 deletions

View File

@@ -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);
}