Commit 9a0f03f815 for qemu.org
commit 9a0f03f81575168283e56dab51bc0f0a13894092
Author: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Date: Tue Nov 10 12:20:09 2026 +0200
virtio-snd: period_bytes divides buffer_bytes
Add a check for the VIRTIO spec statement:
5.14.6.6.3.2 Driver Requirements: Stream Parameters
period_bytes MUST be a divider buffer_bytes, i.e. buffer_bytes % period_bytes == 0.
Reviewed-by: Jim MacArthur <jim.macarthur@linaro.org>
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c
index a6036d5b75..1cbc4da752 100644
--- a/hw/audio/virtio-snd.c
+++ b/hw/audio/virtio-snd.c
@@ -380,6 +380,17 @@ uint32_t virtio_snd_set_pcm_params(VirtIOSound *s,
return cpu_to_le32(VIRTIO_SND_S_BAD_MSG);
}
+ if (le32_to_cpu(params->buffer_bytes)
+ % le32_to_cpu(params->period_bytes) != 0) {
+ error_report("%s: 5.14.6.6.3.2 period_bytes MUST be a divider of "
+ "buffer_bytes, i.e. buffer_bytes %% period_bytes == 0. "
+ "Got buffer_bytes = %"PRIu32", period_bytes = %"PRIu32,
+ VIRTIO_DEVICE(s)->name,
+ le32_to_cpu(params->buffer_bytes),
+ le32_to_cpu(params->period_bytes));
+ return cpu_to_le32(VIRTIO_SND_S_BAD_MSG);
+ }
+
st_params = virtio_snd_pcm_get_params(s, stream_id);
st_params->buffer_bytes = le32_to_cpu(params->buffer_bytes);