Skip to content

Commit

Permalink
Error handling mock.rs
Browse files Browse the repository at this point in the history
Add error handling to mock.rs. This is needed
because otherwise during fuzzing we get panics
that are not related to the code.
Signed-off-by: Delia-Maria Pavel <delia_maria.pavel@stud.acs.upb.ro>
  • Loading branch information
DeliaPavel authored and lauralt committed May 13, 2022
1 parent fd17757 commit 8cd4b9c
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 112 deletions.
18 changes: 9 additions & 9 deletions crates/devices/virtio-blk/src/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ mod tests {
];
// Create a queue of max 16 descriptors and a descriptor chain based on the array above.
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..3]);
let mut chain = queue.build_desc_chain(&v[..3]).unwrap();

let req_header = RequestHeader {
request_type: VIRTIO_BLK_T_IN,
Expand All @@ -324,7 +324,7 @@ mod tests {
// A device-readable request status descriptor.
Descriptor::new(0x30_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..3]);
let mut chain = queue.build_desc_chain(&v[..3]).unwrap();

// Status descriptor should be device-writable.
assert_eq!(
Expand All @@ -338,7 +338,7 @@ mod tests {
// Status descriptor with len = 0.
Descriptor::new(0x30_0000, 0x0, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..3]);
let mut chain = queue.build_desc_chain(&v[..3]).unwrap();
assert_eq!(
Request::parse(&mut chain).unwrap_err(),
Error::DescriptorLengthTooSmall
Expand All @@ -349,7 +349,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, 0, 0),
Descriptor::new(0x30_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..3]);
let mut chain = queue.build_desc_chain(&v[..3]).unwrap();

// Flush request with sector != 0.
let req_header = RequestHeader {
Expand All @@ -366,7 +366,7 @@ mod tests {
Error::InvalidFlushSector
);

let mut chain = queue.build_desc_chain(&v[..3]);
let mut chain = queue.build_desc_chain(&v[..3]).unwrap();
mem.write_obj::<u32>(VIRTIO_BLK_T_IN, GuestAddress(0x10_0000))
.unwrap();
// We shouldn't read from a device-readable buffer.
Expand All @@ -390,7 +390,7 @@ mod tests {
mem.write_obj::<RequestHeader>(req_header, GuestAddress(0x10_0000))
.unwrap();

let mut chain = queue.build_desc_chain(&v[..4]);
let mut chain = queue.build_desc_chain(&v[..4]).unwrap();

// The status descriptor would cause a write beyond capacity.
assert_eq!(
Expand All @@ -415,7 +415,7 @@ mod tests {
mem.write_obj::<RequestHeader>(req_header, GuestAddress(0x10_0000))
.unwrap();

let mut chain = queue.build_desc_chain(&v[..4]);
let mut chain = queue.build_desc_chain(&v[..4]).unwrap();

let request = Request::parse(&mut chain).unwrap();
let expected_request = Request {
Expand All @@ -440,7 +440,7 @@ mod tests {
mem.write_obj::<RequestHeader>(req_header, GuestAddress(0x10_0000))
.unwrap();

let mut chain = queue.build_desc_chain(&v[..4]);
let mut chain = queue.build_desc_chain(&v[..4]).unwrap();

let request = Request::parse(&mut chain).unwrap();
assert_eq!(request.request_type(), RequestType::Unsupported(2));
Expand All @@ -458,7 +458,7 @@ mod tests {
mem.write_obj::<RequestHeader>(req_header, GuestAddress(0x10_0000))
.unwrap();

let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert!(Request::parse(&mut chain).is_ok());
}
}
52 changes: 26 additions & 26 deletions crates/devices/virtio-vsock/src/packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::UnexpectedReadOnlyDescriptor
Expand All @@ -719,7 +719,7 @@ mod tests {
Descriptor::new(0x10_0000, PKT_HEADER_SIZE as u32 - 1, VIRTQ_DESC_F_WRITE, 0),
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorLengthTooSmall
Expand All @@ -729,7 +729,7 @@ mod tests {
Descriptor::new(0x10_0000, PKT_HEADER_SIZE as u32, VIRTQ_DESC_F_WRITE, 0),
Descriptor::new(0x20_0000, MAX_PKT_BUF_SIZE + 1, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorLengthTooLong
Expand All @@ -739,7 +739,7 @@ mod tests {
// The data descriptor should always be present on the RX path.
Descriptor::new(0x10_0000, PKT_HEADER_SIZE as u32, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..1]);
let mut chain = queue.build_desc_chain(&v[..1]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorChainTooShort
Expand All @@ -749,7 +749,7 @@ mod tests {
Descriptor::new(0x10_0000, 0x100, 0, 0),
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::UnexpectedReadOnlyDescriptor
Expand All @@ -764,7 +764,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidBackendAddress)
Expand All @@ -775,7 +775,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
Descriptor::new(0x30_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidGuestAddress(GuestAddress(
Expand All @@ -788,7 +788,7 @@ mod tests {
// A device-readable packet data descriptor should be invalid.
Descriptor::new(0x8_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::UnexpectedReadOnlyDescriptor
Expand All @@ -798,7 +798,7 @@ mod tests {
// The data array doesn't fit entirely in the memory bounds.
Descriptor::new(0x10_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidBackendAddress)
Expand All @@ -809,7 +809,7 @@ mod tests {
// The data array is outside the memory bounds.
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidGuestAddress(GuestAddress(
Expand All @@ -822,7 +822,7 @@ mod tests {
Descriptor::new(0x5_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
Descriptor::new(0x8_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();

let packet = VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap();
assert_eq!(packet.header, PacketHeader::default());
Expand Down Expand Up @@ -860,7 +860,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, 0, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::UnexpectedWriteOnlyDescriptor
Expand All @@ -871,15 +871,15 @@ mod tests {
Descriptor::new(0x10_0000, PKT_HEADER_SIZE as u32 - 1, 0, 0),
Descriptor::new(0x20_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorLengthTooSmall
);

// On the TX path, it is allowed to not have a data descriptor.
let v = vec![Descriptor::new(0x10_0000, PKT_HEADER_SIZE as u32, 0, 0)];
let mut chain = queue.build_desc_chain(&v[..1]);
let mut chain = queue.build_desc_chain(&v[..1]).unwrap();

let header = PacketHeader {
src_cid: SRC_CID.into(),
Expand Down Expand Up @@ -914,7 +914,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, 0, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidBackendAddress)
Expand All @@ -925,7 +925,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, 0, 0),
Descriptor::new(0x30_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidGuestAddress(GuestAddress(
Expand All @@ -952,7 +952,7 @@ mod tests {
Descriptor::new(0x5_0000, 0x100, 0, 0),
Descriptor::new(0x8_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidHeaderLen(MAX_PKT_BUF_SIZE + 1)
Expand All @@ -976,7 +976,7 @@ mod tests {
// The data descriptor is missing.
Descriptor::new(0x5_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..1]);
let mut chain = queue.build_desc_chain(&v[..1]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorChainTooShort
Expand All @@ -987,7 +987,7 @@ mod tests {
// The data array doesn't fit entirely in the memory bounds.
Descriptor::new(0x10_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidBackendAddress)
Expand All @@ -998,7 +998,7 @@ mod tests {
// The data array is outside the memory bounds.
Descriptor::new(0x20_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::InvalidMemoryAccess(GuestMemoryError::InvalidGuestAddress(GuestAddress(
Expand All @@ -1011,7 +1011,7 @@ mod tests {
// A device-writable packet data descriptor should be invalid.
Descriptor::new(0x8_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::UnexpectedWriteOnlyDescriptor
Expand All @@ -1022,7 +1022,7 @@ mod tests {
// A data length < the length of data as described by the header.
Descriptor::new(0x8_0000, LEN - 1, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();
assert_eq!(
VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap_err(),
Error::DescriptorLengthTooSmall
Expand All @@ -1033,7 +1033,7 @@ mod tests {
Descriptor::new(0x5_0000, 0x100, 0, 0),
Descriptor::new(0x8_0000, 0x100, 0, 0),
];
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();

let packet = VsockPacket::from_tx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap();
assert_eq!(packet.header, header);
Expand Down Expand Up @@ -1071,7 +1071,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();

let mut packet =
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap();
Expand Down Expand Up @@ -1195,7 +1195,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();

let mut packet =
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap();
Expand Down Expand Up @@ -1279,7 +1279,7 @@ mod tests {
Descriptor::new(0x20_0000, 0x100, VIRTQ_DESC_F_WRITE, 0),
];
let queue = MockSplitQueue::new(&mem, 16);
let mut chain = queue.build_desc_chain(&v[..2]);
let mut chain = queue.build_desc_chain(&v[..2]).unwrap();

let mut packet =
VsockPacket::from_rx_virtq_chain(&mem, &mut chain, MAX_PKT_BUF_SIZE).unwrap();
Expand Down
4 changes: 2 additions & 2 deletions crates/virtio-queue/benches/queue/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ pub fn benchmark_queue(c: &mut Criterion) {
let mut mq = MockSplitQueue::new(&mem, 256);
for _ in 0..num_chains {
if indirect {
mq.add_indirect_chain(len);
mq.add_indirect_chain(len).unwrap();
} else {
mq.add_chain(len);
mq.add_chain(len).unwrap();
}
}
mq.create_queue(GuestMemoryAtomic::new(mem.clone()))
Expand Down
Loading

0 comments on commit 8cd4b9c

Please sign in to comment.