Re: [PATCH v2 1/4] virtio-mem: validate device-reported block size

From: David Hildenbrand (Arm)

Date: Thu Jul 16 2026 - 04:59:54 EST


On 7/15/26 18:41, Hari Mishal wrote:
> The device_block_size read from the virtio-mem config space is used as a
> divisor and also in ALIGN_DOWN() further down the code path in the
> driver without further validation. A zero value leads to a division by
> zero, and a non-power-of-two value corrupts the ALIGN_DOWN() bitmask
> arithmetic leading to a misreporting of guest-usable ram, post crash.
>
> Reject both at init time instead of trusting the device.
>
> Signed-off-by: Hari Mishal <harimishal1@xxxxxxxxx>
> ---
> v2: dropped the redundant explicit zero check, since
> is_power_of_2(0) already returns false.
>
> drivers/virtio/virtio_mem.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c
> index 11c441501582..0e04fec458af 100644
> --- a/drivers/virtio/virtio_mem.c
> +++ b/drivers/virtio/virtio_mem.c
> @@ -2847,6 +2847,12 @@ static int virtio_mem_init(struct virtio_mem *vm)
> &vm->plugged_size);
> virtio_cread_le(vm->vdev, struct virtio_mem_config, block_size,
> &vm->device_block_size);
> + if (!is_power_of_2(vm->device_block_size)) {
> + dev_err(&vm->vdev->dev,
> + "invalid device block size: 0x%llx\n",
> + (unsigned long long)vm->device_block_size);
> + return -EINVAL;
> + }

The spec states "The device MUST set block_size to a power of two."

I'm missing the point here.

--
Cheers,

David