Skip to content

Commit d15ded1

Browse files
committed
feat: validate driver set queue size
Add a validation of the queue size set by the guest. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent e29818a commit d15ded1

File tree

8 files changed

+15
-14
lines changed

8 files changed

+15
-14
lines changed

src/vmm/src/devices/virtio/balloon/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,7 @@ impl VirtioDevice for Balloon {
606606

607607
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
608608
for q in self.queues.iter_mut() {
609-
q.initialize(&mem)
610-
.map_err(ActivateError::QueueMemoryError)?;
609+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
611610
}
612611

613612
self.device_state = DeviceState::Activated(mem);

src/vmm/src/devices/virtio/block/vhost_user/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,7 @@ impl<T: VhostUserHandleBackend + Send + 'static> VirtioDevice for VhostUserBlock
332332

333333
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
334334
for q in self.queues.iter_mut() {
335-
q.initialize(&mem)
336-
.map_err(ActivateError::QueueMemoryError)?;
335+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
337336
}
338337

339338
let start_time = get_time_us(ClockType::Monotonic);

src/vmm/src/devices/virtio/block/virtio/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -628,8 +628,7 @@ impl VirtioDevice for VirtioBlock {
628628

629629
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
630630
for q in self.queues.iter_mut() {
631-
q.initialize(&mem)
632-
.map_err(ActivateError::QueueMemoryError)?;
631+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
633632
}
634633

635634
let event_idx = self.has_feature(u64::from(VIRTIO_RING_F_EVENT_IDX));

src/vmm/src/devices/virtio/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ pub enum ActivateError {
7272
VhostUser(vhost_user::VhostUserError),
7373
/// Setting tap interface offload flags failed: {0}
7474
TapSetOffload(TapError),
75-
/// Error setting pointers in the queue: (0)
76-
QueueMemoryError(QueueError),
75+
/// Error initializing the queue: (0)
76+
QueueError(QueueError),
7777
}
7878

7979
/// Trait that helps in upcasting an object to Any

src/vmm/src/devices/virtio/net/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,7 @@ impl VirtioDevice for Net {
10001000

10011001
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
10021002
for q in self.queues.iter_mut() {
1003-
q.initialize(&mem)
1004-
.map_err(ActivateError::QueueMemoryError)?;
1003+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
10051004
}
10061005

10071006
let event_idx = self.has_feature(u64::from(VIRTIO_RING_F_EVENT_IDX));

src/vmm/src/devices/virtio/queue.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub enum QueueError {
3232
DescIndexOutOfBounds(u16),
3333
/// Failed to write value into the virtio queue used ring: {0}
3434
MemoryError(#[from] vm_memory::GuestMemoryError),
35+
/// Invalid queue size configured by the driver: max: {0} configured: {1}
36+
InvalidQueueSize(u16, u16),
3537
/// Pointer is not aligned properly: {0:#x} not {1}-byte aligned.
3638
PointerNotAligned(usize, u8),
3739
}
@@ -322,9 +324,14 @@ impl Queue {
322324
Ok(slice.ptr_guard_mut().as_ptr())
323325
}
324326

327+
/// Do final checks and setup of the queue before it can be usable.
325328
/// Set up pointers to the queue objects in the guest memory
326329
/// and mark memory dirty for those objects
327330
pub fn initialize<M: GuestMemory>(&mut self, mem: &M) -> Result<(), QueueError> {
331+
if self.max_size < self.size {
332+
return Err(QueueError::InvalidQueueSize(self.max_size, self.size));
333+
}
334+
328335
self.desc_table_ptr = self
329336
.get_slice_ptr(mem, self.desc_table_address, self.desc_table_size())?
330337
.cast();

src/vmm/src/devices/virtio/rng/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,7 @@ impl VirtioDevice for Entropy {
294294

295295
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
296296
for q in self.queues.iter_mut() {
297-
q.initialize(&mem)
298-
.map_err(ActivateError::QueueMemoryError)?;
297+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
299298
}
300299

301300
self.activate_event.write(1).map_err(|_| {

src/vmm/src/devices/virtio/vsock/device.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,7 @@ where
331331

332332
fn activate(&mut self, mem: GuestMemoryMmap) -> Result<(), ActivateError> {
333333
for q in self.queues.iter_mut() {
334-
q.initialize(&mem)
335-
.map_err(ActivateError::QueueMemoryError)?;
334+
q.initialize(&mem).map_err(ActivateError::QueueError)?;
336335
}
337336

338337
if self.queues.len() != defs::VSOCK_NUM_QUEUES {

0 commit comments

Comments
 (0)