diff options
| author | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2025-08-28 11:17:48 +0200 |
|---|---|---|
| committer | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2025-09-02 15:22:03 +0200 |
| commit | 7bba5411e7b2f6f8586d441d0fc04dda3197608e (patch) | |
| tree | f2a6e54f80b3d86c35eb0bbf96a3c7040df2f282 | |
| parent | 073a94f8ff87d4f696c1269eda7b620836fe09fa (diff) | |
| download | mullvadvpn-7bba5411e7b2f6f8586d441d0fc04dda3197608e.tar.xz mullvadvpn-7bba5411e7b2f6f8586d441d0fc04dda3197608e.zip | |
Add error for fragments with < 2 items
| -rw-r--r-- | mullvad-masque-proxy/src/fragment.rs | 11 |
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) |
