mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
hw/audio/virtio-sound: return correct command response size
The payload size returned by command VIRTIO_SND_R_PCM_INFO is wrong. The code in process_cmd() assumes that all commands return only a virtio_snd_hdr payload, but some commands like VIRTIO_SND_R_PCM_INFO may return an additional payload. Add a zero initialized payload_size variable to struct virtio_snd_ctrl_command to allow for additional payloads. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Message-Id: <20240218083351.8524-1-vr_qemu@t-online.de> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
3a95f57211
commit
633487df8d
2 changed files with 6 additions and 2 deletions
|
@ -243,12 +243,13 @@ static void virtio_snd_handle_pcm_info(VirtIOSound *s,
|
||||||
memset(&pcm_info[i].padding, 0, 5);
|
memset(&pcm_info[i].padding, 0, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd->payload_size = sizeof(virtio_snd_pcm_info) * count;
|
||||||
cmd->resp.code = cpu_to_le32(VIRTIO_SND_S_OK);
|
cmd->resp.code = cpu_to_le32(VIRTIO_SND_S_OK);
|
||||||
iov_from_buf(cmd->elem->in_sg,
|
iov_from_buf(cmd->elem->in_sg,
|
||||||
cmd->elem->in_num,
|
cmd->elem->in_num,
|
||||||
sizeof(virtio_snd_hdr),
|
sizeof(virtio_snd_hdr),
|
||||||
pcm_info,
|
pcm_info,
|
||||||
sizeof(virtio_snd_pcm_info) * count);
|
cmd->payload_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -749,7 +750,8 @@ process_cmd(VirtIOSound *s, virtio_snd_ctrl_command *cmd)
|
||||||
0,
|
0,
|
||||||
&cmd->resp,
|
&cmd->resp,
|
||||||
sizeof(virtio_snd_hdr));
|
sizeof(virtio_snd_hdr));
|
||||||
virtqueue_push(cmd->vq, cmd->elem, sizeof(virtio_snd_hdr));
|
virtqueue_push(cmd->vq, cmd->elem,
|
||||||
|
sizeof(virtio_snd_hdr) + cmd->payload_size);
|
||||||
virtio_notify(VIRTIO_DEVICE(s), cmd->vq);
|
virtio_notify(VIRTIO_DEVICE(s), cmd->vq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,6 +810,7 @@ static void virtio_snd_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
||||||
cmd->elem = elem;
|
cmd->elem = elem;
|
||||||
cmd->vq = vq;
|
cmd->vq = vq;
|
||||||
cmd->resp.code = cpu_to_le32(VIRTIO_SND_S_OK);
|
cmd->resp.code = cpu_to_le32(VIRTIO_SND_S_OK);
|
||||||
|
/* implicit cmd->payload_size = 0; */
|
||||||
QTAILQ_INSERT_TAIL(&s->cmdq, cmd, next);
|
QTAILQ_INSERT_TAIL(&s->cmdq, cmd, next);
|
||||||
elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
|
elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,6 +230,7 @@ struct virtio_snd_ctrl_command {
|
||||||
VirtQueue *vq;
|
VirtQueue *vq;
|
||||||
virtio_snd_hdr ctrl;
|
virtio_snd_hdr ctrl;
|
||||||
virtio_snd_hdr resp;
|
virtio_snd_hdr resp;
|
||||||
|
size_t payload_size;
|
||||||
QTAILQ_ENTRY(virtio_snd_ctrl_command) next;
|
QTAILQ_ENTRY(virtio_snd_ctrl_command) next;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue