Skip to content

Commit 4b1d417

Browse files
authored
Merge pull request from GHSA-hxq4-mx37-fqvg
1 parent 3ebebc6 commit 4b1d417

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

quic/s2n-quic-platform/src/message.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,48 @@ pub struct RxMessage<'a, Handle: Copy> {
138138
impl<'a, Handle: Copy> RxMessage<'a, Handle> {
139139
#[inline]
140140
pub fn for_each<F: FnMut(datagram::Header<Handle>, &mut [u8])>(self, mut on_packet: F) {
141-
debug_assert_ne!(self.segment_size, 0);
141+
// `chunks_mut` doesn't know what to do with zero-sized segments so return early
142+
if self.segment_size == 0 {
143+
return;
144+
}
142145

143146
for segment in self.payload.chunks_mut(self.segment_size) {
144147
on_packet(self.header, segment);
145148
}
146149
}
147150
}
151+
152+
#[cfg(test)]
153+
mod tests {
154+
use super::*;
155+
use bolero::check;
156+
157+
#[test]
158+
#[cfg_attr(kani, kani::proof, kani::unwind(17), kani::solver(cadical))]
159+
fn rx_message_test() {
160+
let path = bolero::gen::<path::RemoteAddress>();
161+
let ecn = bolero::gen();
162+
let segment_size = bolero::gen();
163+
let max_payload_len = if cfg!(kani) { 16 } else { u16::MAX as usize };
164+
let payload_len = 0..=max_payload_len;
165+
166+
check!()
167+
.with_generator((path, ecn, segment_size, payload_len))
168+
.cloned()
169+
.for_each(|(path, ecn, segment_size, payload_len)| {
170+
let mut payload = vec![0u8; payload_len];
171+
let rx_message = RxMessage {
172+
header: datagram::Header { path, ecn },
173+
segment_size,
174+
payload: &mut payload,
175+
};
176+
177+
rx_message.for_each(|header, segment| {
178+
assert_eq!(header.path, path);
179+
assert_eq!(header.ecn, ecn);
180+
assert!(segment.len() <= payload_len);
181+
assert!(segment.len() <= segment_size);
182+
})
183+
})
184+
}
185+
}

0 commit comments

Comments
 (0)