On Wed, Jul 15, 2026 at 04:22:40PM +0200, 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 guest ram, post
> crash. Reject both at init time instead of trusting the device.
> 
> Assisted-by: gkh_clanker:t1000
> Signed-off-by: Hari Mishal <[email protected]>
> ---
>  drivers/virtio/virtio_mem.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c
> index 11c441501582..43d12ec7c323 100644
> --- a/drivers/virtio/virtio_mem.c
> +++ b/drivers/virtio/virtio_mem.c
> @@ -2847,6 +2847,13 @@ 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 (!vm->device_block_size ||
> +         !is_power_of_2(vm->device_block_size)) {

0 is not a power of 2, why do we need to check twice?

> +             dev_err(&vm->vdev->dev,
> +                     "invalid device block size: 0x%llx\n",
> +                     (unsigned long long)vm->device_block_size);
> +             return -EINVAL;
> +     }
>       virtio_cread_le(vm->vdev, struct virtio_mem_config, node_id,
>                       &node_id);
>       vm->nid = virtio_mem_translate_node_id(vm, node_id);
> -- 
> 2.43.0


Reply via email to