Skip to content

Commit 4994c1b

Browse files
committed
refactor: safer write_used_ring method
Now `write_used_ring` makes sure the index is in correct bounds. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent f3197af commit 4994c1b

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -444,12 +444,11 @@ impl Queue {
444444
) -> Result<(), QueueError> {
445445
debug_assert!(self.is_layout_valid(mem));
446446

447-
let next_used = self.next_used.0 % self.actual_size();
448447
let used_element = UsedElement {
449448
id: u32::from(desc_index),
450449
len,
451450
};
452-
self.write_used_ring(mem, next_used, used_element)?;
451+
self.write_used_ring(mem, self.next_used.0, used_element)?;
453452
self.advance_used_ring(mem, 1);
454453
Ok(())
455454
}
@@ -489,11 +488,14 @@ impl Queue {
489488
// We calculate offset into `ring` field.
490489
let used_ring_offset = std::mem::size_of::<u16>()
491490
+ std::mem::size_of::<u16>()
492-
+ std::mem::size_of::<UsedElement>() * usize::from(index);
491+
+ std::mem::size_of::<UsedElement>() * usize::from(index % self.actual_size());
493492
let used_element_address = self.used_ring.unchecked_add(usize_to_u64(used_ring_offset));
494493

495-
mem.write_obj(used_element, used_element_address)
496-
.map_err(QueueError::UsedRing)
494+
// SAFETY:
495+
// `used_element_address` param is bounded by size of the queue as `index` is
496+
// modded by `actual_size()`.
497+
mem.write_obj(used_element, used_element_address).unwrap();
498+
Ok(())
497499
}
498500

499501
/// Fetch the available ring index (`virtq_avail->idx`) from guest memory.

0 commit comments

Comments
 (0)