Index: uspace/lib/virtio/virtio-pci.c
===================================================================
--- uspace/lib/virtio/virtio-pci.c	(revision 21ff05407c028776b0c306f1dbf9b47264488871)
+++ uspace/lib/virtio/virtio-pci.c	(revision 5f03107aa1f3a9bced9f16ed768a3ea82fa6f869)
@@ -36,5 +36,6 @@
 #include <pci_dev_iface.h>
 
-static bool check_bar(virtio_dev_t *vdev, uint8_t bar)
+static bool check_bar(virtio_dev_t *vdev, uint8_t bar, uint32_t offset,
+    uint32_t length)
 {
 	/* We must ignore the capability if bar is greater than 5 */
@@ -46,4 +47,14 @@
 		return false;
 
+	uintptr_t start = (uintptr_t) vdev->bar[bar].mapped_base;
+	if (start + offset < start)
+		return false;
+	if (start + offset > start + vdev->bar[bar].mapped_size)
+		return false;
+	if (start + offset + length < start + offset)
+		return false;
+	if (start + offset + length > start + vdev->bar[bar].mapped_size)
+		return false;
+
 	return true;
 }
@@ -55,5 +66,5 @@
 		return;
 
-	if (!check_bar(vdev, bar))
+	if (!check_bar(vdev, bar, offset, length))
 		return;
 
@@ -69,5 +80,5 @@
 		return;
 
-	if (!check_bar(vdev, bar))
+	if (!check_bar(vdev, bar, offset, length))
 		return;
 
@@ -85,5 +96,5 @@
 		return;
 
-	if (!check_bar(vdev, bar))
+	if (!check_bar(vdev, bar, offset, length))
 		return;
 
@@ -99,5 +110,5 @@
 		return;
 
-	if (!check_bar(vdev, bar))
+	if (!check_bar(vdev, bar, offset, length))
 		return;
 
