mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
udp protocol: test that parsing slices of various lengths doesn't panic
This commit is contained in:
parent
277a707344
commit
755281d340
1 changed files with 40 additions and 1 deletions
|
|
@ -90,12 +90,22 @@ impl Request {
|
||||||
let remaining_bytes = {
|
let remaining_bytes = {
|
||||||
let position = bytes.position() as usize;
|
let position = bytes.position() as usize;
|
||||||
let inner = bytes.into_inner();
|
let inner = bytes.into_inner();
|
||||||
|
|
||||||
|
// Slice will be empty if position == inner.len()
|
||||||
&inner[position..]
|
&inner[position..]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if remaining_bytes.is_empty() {
|
||||||
|
return Err(RequestParseError::sendable_text(
|
||||||
|
"Full scrapes are not allowed",
|
||||||
|
connection_id,
|
||||||
|
transaction_id,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
let info_hashes = FromBytes::slice_from(remaining_bytes).ok_or_else(|| {
|
let info_hashes = FromBytes::slice_from(remaining_bytes).ok_or_else(|| {
|
||||||
RequestParseError::sendable_text(
|
RequestParseError::sendable_text(
|
||||||
"Invalid info hash list. Note that full scrapes are not allowed",
|
"Invalid info hash list",
|
||||||
connection_id,
|
connection_id,
|
||||||
transaction_id,
|
transaction_id,
|
||||||
)
|
)
|
||||||
|
|
@ -371,4 +381,33 @@ mod tests {
|
||||||
|
|
||||||
TestResult::from_bool(same_after_conversion(request.into()))
|
TestResult::from_bool(same_after_conversion(request.into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_various_input_lengths() {
|
||||||
|
for action in 0i32..4 {
|
||||||
|
for max_scrape_torrents in 0..3 {
|
||||||
|
for num_bytes in 0..256 {
|
||||||
|
let mut request_bytes = ::std::iter::repeat(0).take(num_bytes).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
if let Some(action_bytes) = request_bytes.get_mut(8..12) {
|
||||||
|
action_bytes.copy_from_slice(&action.to_be_bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should never panic
|
||||||
|
let _ = Request::parse_bytes(&request_bytes, max_scrape_torrents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_scrape_request_with_no_info_hashes() {
|
||||||
|
let mut request_bytes = Vec::new();
|
||||||
|
|
||||||
|
request_bytes.extend(0i64.to_be_bytes());
|
||||||
|
request_bytes.extend(2i32.to_be_bytes());
|
||||||
|
request_bytes.extend(0i32.to_be_bytes());
|
||||||
|
|
||||||
|
Request::parse_bytes(&request_bytes, 1).unwrap_err();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue