@@ -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