Return an error result if the filterload msg size is out of bounds

This commit is contained in:
Deirdre Connolly 2019-12-05 00:32:32 -05:00 committed by Deirdre Connolly
parent cbd95dfc1f
commit d559a3fa52
1 changed files with 9 additions and 5 deletions

View File

@ -599,12 +599,18 @@ impl Codec {
} }
fn read_filterload<R: Read>(&self, mut reader: R, body_len: usize) -> Result<Message, Error> { fn read_filterload<R: Read>(&self, mut reader: R, body_len: usize) -> Result<Message, Error> {
if !(FILTERLOAD_REMAINDER_LENGTH <= body_len
&& body_len <= FILTERLOAD_REMAINDER_LENGTH + MAX_FILTER_LENGTH)
{
return Err(Error::Parse("Invalid filterload message body length."));
}
const MAX_FILTER_LENGTH: usize = 36000; const MAX_FILTER_LENGTH: usize = 36000;
const FILTERLOAD_REMAINDER_LENGTH: usize = 4 + 4 + 1; const FILTERLOAD_REMAINDER_LENGTH: usize = 4 + 4 + 1;
let filter_length: usize = body_len - FILTERLOAD_REMAINDER_LENGTH; let filter_length: usize = body_len - FILTERLOAD_REMAINDER_LENGTH;
let mut filter_bytes = vec![0; std::cmp::min(filter_length, MAX_FILTER_LENGTH)]; let mut filter_bytes = vec![0; filter_length];
reader.read_exact(&mut filter_bytes)?; reader.read_exact(&mut filter_bytes)?;
Ok(Message::FilterLoad { Ok(Message::FilterLoad {
@ -746,15 +752,13 @@ mod tests {
bytes bytes
}); });
let v_parsed = rt.block_on(async { rt.block_on(async {
let mut fr = FramedRead::new(Cursor::new(&v_bytes), Codec::builder().finish()); let mut fr = FramedRead::new(Cursor::new(&v_bytes), Codec::builder().finish());
fr.next() fr.next()
.await .await
.expect("a next message should be available") .expect("a next message should be available")
.expect("that message should deserialize") .expect_err("that message should not deserialize")
}); });
assert_ne!(v, v_parsed);
} }
#[test] #[test]