|
@@ -20,7 +20,7 @@ const EVENT_QUEUE_IDX: u16 = 2;
|
|
|
|
|
|
pub(crate) const QUEUE_SIZE: usize = 8;
|
|
|
|
|
|
-/// The size in bytes of each buffer used in the RX virtqueue.
|
|
|
+/// The size in bytes of each buffer used in the RX virtqueue. This must be bigger than size_of::<VirtioVsockHdr>().
|
|
|
const RX_BUFFER_SIZE: usize = 512;
|
|
|
|
|
|
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
|
@@ -487,11 +487,15 @@ impl<H: Hal, T: Transport> VirtIOSocket<H, T> {
|
|
|
}
|
|
|
|
|
|
fn read_header_and_body(buffer: &[u8]) -> Result<(VirtioVsockHdr, &[u8])> {
|
|
|
- let header = VirtioVsockHdr::read_from_prefix(buffer).ok_or(SocketError::BufferTooShort)?;
|
|
|
+ // Shouldn't panic, because we know `RX_BUFFER_SIZE > size_of::<VirtioVsockHdr>()`.
|
|
|
+ let header = VirtioVsockHdr::read_from_prefix(buffer).unwrap();
|
|
|
let body_length = header.len() as usize;
|
|
|
+
|
|
|
+ // This could fail if the device returns an unreasonably long body length.
|
|
|
let data_end = size_of::<VirtioVsockHdr>()
|
|
|
.checked_add(body_length)
|
|
|
.ok_or(SocketError::InvalidNumber)?;
|
|
|
+ // This could fail if the device returns a body length longer than the buffer we gave it.
|
|
|
let data = buffer
|
|
|
.get(size_of::<VirtioVsockHdr>()..data_end)
|
|
|
.ok_or(SocketError::BufferTooShort)?;
|