summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSebastian Holmin <sebastian.holmin@mullvad.net>2025-08-28 11:17:48 +0200
committerSebastian Holmin <sebastian.holmin@mullvad.net>2025-09-02 15:22:03 +0200
commit7bba5411e7b2f6f8586d441d0fc04dda3197608e (patch)
treef2a6e54f80b3d86c35eb0bbf96a3c7040df2f282
parent073a94f8ff87d4f696c1269eda7b620836fe09fa (diff)
downloadmullvadvpn-7bba5411e7b2f6f8586d441d0fc04dda3197608e.tar.xz
mullvadvpn-7bba5411e7b2f6f8586d441d0fc04dda3197608e.zip
Add error for fragments with < 2 items
-rw-r--r--mullvad-masque-proxy/src/fragment.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/mullvad-masque-proxy/src/fragment.rs b/mullvad-masque-proxy/src/fragment.rs
index 9a47295fb3..6f4a84b0d9 100644
--- a/mullvad-masque-proxy/src/fragment.rs
+++ b/mullvad-masque-proxy/src/fragment.rs
@@ -34,6 +34,9 @@ pub enum DefragError {
#[error("Payload is too small")]
PayloadTooSmall,
+
+ #[error("Too few fragments in fragmented packet")]
+ TooFewFragments,
}
// When a packet is larger than u16::MAX, it can't be fragmented.
@@ -84,6 +87,10 @@ impl Fragments {
let fragment_count = payload
.try_get_u8()
.map_err(|_| DefragError::PayloadTooSmall)?;
+ if fragment_count < 2 {
+ // Packets with only one fragment should be sent as non-fragmented packets.
+ return Err(DefragError::TooFewFragments);
+ }
let fragment = Fragment { index, payload };
// ensure that the fifo has capacity before pushing the new fragment id
@@ -203,9 +210,9 @@ mod test {
fn test_fragment_reconstruction() {
let mut fragments = Fragments::default();
- 'outer: for packet_id in 1..255u16 {
+ let max_payload_size = 50;
+ 'outer: for packet_id in max_payload_size..255u16 {
let payload = (0..packet_id as u8).collect::<Vec<u8>>();
- let max_payload_size = 50;
let mut payload_clone = Bytes::from(payload.clone());
let mut fragment_buf = fragment_packet(max_payload_size, &mut payload_clone, packet_id)