On Thu, May 7, 2026 at 10:45:20PM +0900, Sungho Bae wrote:

> +       if (virtqueue_is_packed(vq)) {
> +               virtqueue_reset_packed(vq);
> +       } else {
> +               /*
> +                * Split queue shadow index should match the visible avail
> +                * index when the queue is fully quiesced.
> +                */
> +               if (WARN_ON(vq->split.avail_idx_shadow !=
> +                       virtio16_to_cpu(vq->vq.vdev,
> +                                       vq->split.vring.avail->idx)))
> +                       return -EBUSY;

A security issue regarding malicious hosts has been raised from sashiko:
https://sashiko.dev/#/patchset/20260506162254.25576-1-baver.bae%40gmail.com?part=2

That is a good point.

However, I do not think this WARN_ON is meant to validate hostile or otherwise 
untrusted host input. The check is there to verify a guest-side invariant at 
reinitialization time: once the queue is fully quiesced and the 
transport/device side has already stopped or reset the queue, the split avail 
shadow index is expected to match the visible avail index.

If a compromised host can still modify the vring contents at that point, then 
this is not a problem specific to this WARN_ON. Such a host can already corrupt 
virtually any shared virtqueue state, so replacing this warning with a plain 
-EBUSY would not meaningfully improve robustness against that threat model.

In other words, this WARN_ON is intended to catch guest/driver state 
inconsistencies or violated call-site assumptions, not to provide protection 
against a malicious host. For the actual failure path, the code already returns 
-EBUSY after the warning.

I therefore think this is better treated as a debugging/invariant check than as 
validation of untrusted input.

Best regards,
Sungho Bae

Reply via email to