Skip to content

Commit 475e13a

Browse files
jiangliuandreeaflorescu
authored andcommitted
virtio-queue: enforce VirtIO queue data structure alignment constraints
The VirtIO Spec 1.0, sec 2.4 defines the alignment constraints for VirtIO queue's descriptor table, available ring and used ring. So enforce the alignment constraints in Queue::is_valid(). Signed-off-by: Liu Jiang <[email protected]>
1 parent 186f87f commit 475e13a

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

devices/src/virtio/queue.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,15 @@ impl Queue {
306306
used_ring_size
307307
);
308308
false
309+
} else if desc_table.offset() & 0xf != 0 {
310+
error!("virtio queue descriptor table breaks alignment contraints");
311+
false
312+
} else if avail_ring.offset() & 0x1 != 0 {
313+
error!("virtio queue available ring breaks alignment contraints");
314+
false
315+
} else if used_ring.offset() & 0x3 != 0 {
316+
error!("virtio queue used ring breaks alignment contraints");
317+
false
309318
} else {
310319
true
311320
}
@@ -712,14 +721,20 @@ pub(crate) mod tests {
712721

713722
q.desc_table = GuestAddress(0xffffffff);
714723
assert!(!q.is_valid(m));
724+
q.desc_table = GuestAddress(0x1001);
725+
assert!(!q.is_valid(m));
715726
q.desc_table = vq.dtable_start();
716727

717728
q.avail_ring = GuestAddress(0xffffffff);
718729
assert!(!q.is_valid(m));
730+
q.avail_ring = GuestAddress(0x1001);
731+
assert!(!q.is_valid(m));
719732
q.avail_ring = vq.avail_start();
720733

721734
q.used_ring = GuestAddress(0xffffffff);
722735
assert!(!q.is_valid(m));
736+
q.used_ring = GuestAddress(0x1001);
737+
assert!(!q.is_valid(m));
723738
q.used_ring = vq.used_start();
724739

725740
{

0 commit comments

Comments
 (0)