* [PATCH] Stop vhost-user sending uninitialized mmap_offsets
@ 2020-06-22 18:41 Raphael Norwitz
2020-06-22 21:30 ` Michael S. Tsirkin
0 siblings, 1 reply; 2+ messages in thread
From: Raphael Norwitz @ 2020-06-22 18:41 UTC (permalink / raw)
To: qemu-devel, mst, peter.maydell; +Cc: marcandre.lureau, Raphael Norwitz
Prior to this change, the vhost_user_fill_msg_region function filled out
all elements of the VhostUserMemoryRegion struct except the mmap_offset.
This function is often called on uninitialized structs, which are then
copied into VHOST_USER_SET_MEM_TABLE and VHOST_USER_ADD/REM_MEM_REG
messages. In some cases, where the mmap_offset was not needed, it was
left uninitialized, causing QEMU to send the backend uninitialized data,
which Coverity flagged as a series of issues.
This change augments the vhost_user_fill_msg_region API, adding a
mmap_offset paramenter, forcing the caller to initialize mmap_offset.
Fixes: CID-1429802, CID-1429803, CID-1429804
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
---
hw/virtio/vhost-user.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 4d6cd4e..3123121 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -460,12 +460,14 @@ static MemoryRegion *vhost_user_get_mr_data(uint64_t addr, ram_addr_t *offset,
}
static void vhost_user_fill_msg_region(VhostUserMemoryRegion *dst,
- struct vhost_memory_region *src)
+ struct vhost_memory_region *src,
+ uint64_t mmap_offset)
{
assert(src != NULL && dst != NULL);
dst->userspace_addr = src->userspace_addr;
dst->memory_size = src->memory_size;
dst->guest_phys_addr = src->guest_phys_addr;
+ dst->mmap_offset = mmap_offset;
}
static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
@@ -500,9 +502,8 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
error_report("Failed preparing vhost-user memory table msg");
return -1;
}
- vhost_user_fill_msg_region(®ion_buffer, reg);
+ vhost_user_fill_msg_region(®ion_buffer, reg, offset);
msg->payload.memory.regions[*fd_num] = region_buffer;
- msg->payload.memory.regions[*fd_num].mmap_offset = offset;
fds[(*fd_num)++] = fd;
} else if (track_ramblocks) {
u->region_rb_offset[i] = 0;
@@ -649,7 +650,7 @@ static int send_remove_regions(struct vhost_dev *dev,
if (fd > 0) {
msg->hdr.request = VHOST_USER_REM_MEM_REG;
- vhost_user_fill_msg_region(®ion_buffer, shadow_reg);
+ vhost_user_fill_msg_region(®ion_buffer, shadow_reg, 0);
msg->payload.mem_reg.region = region_buffer;
if (vhost_user_write(dev, msg, &fd, 1) < 0) {
@@ -709,9 +710,8 @@ static int send_add_regions(struct vhost_dev *dev,
u->region_rb[reg_idx] = mr->ram_block;
}
msg->hdr.request = VHOST_USER_ADD_MEM_REG;
- vhost_user_fill_msg_region(®ion_buffer, reg);
+ vhost_user_fill_msg_region(®ion_buffer, reg, offset);
msg->payload.mem_reg.region = region_buffer;
- msg->payload.mem_reg.region.mmap_offset = offset;
if (vhost_user_write(dev, msg, &fd, 1) < 0) {
return -1;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] Stop vhost-user sending uninitialized mmap_offsets
2020-06-22 18:41 [PATCH] Stop vhost-user sending uninitialized mmap_offsets Raphael Norwitz
@ 2020-06-22 21:30 ` Michael S. Tsirkin
0 siblings, 0 replies; 2+ messages in thread
From: Michael S. Tsirkin @ 2020-06-22 21:30 UTC (permalink / raw)
To: Raphael Norwitz; +Cc: peter.maydell, qemu-devel, marcandre.lureau
On Mon, Jun 22, 2020 at 06:41:39PM +0000, Raphael Norwitz wrote:
> Prior to this change, the vhost_user_fill_msg_region function filled out
> all elements of the VhostUserMemoryRegion struct except the mmap_offset.
>
> This function is often called on uninitialized structs, which are then
> copied into VHOST_USER_SET_MEM_TABLE and VHOST_USER_ADD/REM_MEM_REG
> messages. In some cases, where the mmap_offset was not needed, it was
> left uninitialized, causing QEMU to send the backend uninitialized data,
> which Coverity flagged as a series of issues.
>
> This change augments the vhost_user_fill_msg_region API, adding a
> mmap_offset paramenter, forcing the caller to initialize mmap_offset.
>
> Fixes: CID-1429802, CID-1429803, CID-1429804
Add commit hash of the buggy commit pls.
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
> ---
> hw/virtio/vhost-user.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index 4d6cd4e..3123121 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -460,12 +460,14 @@ static MemoryRegion *vhost_user_get_mr_data(uint64_t addr, ram_addr_t *offset,
> }
>
> static void vhost_user_fill_msg_region(VhostUserMemoryRegion *dst,
> - struct vhost_memory_region *src)
> + struct vhost_memory_region *src,
> + uint64_t mmap_offset)
> {
> assert(src != NULL && dst != NULL);
> dst->userspace_addr = src->userspace_addr;
> dst->memory_size = src->memory_size;
> dst->guest_phys_addr = src->guest_phys_addr;
> + dst->mmap_offset = mmap_offset;
> }
>
> static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
> @@ -500,9 +502,8 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
> error_report("Failed preparing vhost-user memory table msg");
> return -1;
> }
> - vhost_user_fill_msg_region(®ion_buffer, reg);
> + vhost_user_fill_msg_region(®ion_buffer, reg, offset);
> msg->payload.memory.regions[*fd_num] = region_buffer;
> - msg->payload.memory.regions[*fd_num].mmap_offset = offset;
> fds[(*fd_num)++] = fd;
> } else if (track_ramblocks) {
> u->region_rb_offset[i] = 0;
> @@ -649,7 +650,7 @@ static int send_remove_regions(struct vhost_dev *dev,
>
> if (fd > 0) {
> msg->hdr.request = VHOST_USER_REM_MEM_REG;
> - vhost_user_fill_msg_region(®ion_buffer, shadow_reg);
> + vhost_user_fill_msg_region(®ion_buffer, shadow_reg, 0);
> msg->payload.mem_reg.region = region_buffer;
>
> if (vhost_user_write(dev, msg, &fd, 1) < 0) {
> @@ -709,9 +710,8 @@ static int send_add_regions(struct vhost_dev *dev,
> u->region_rb[reg_idx] = mr->ram_block;
> }
> msg->hdr.request = VHOST_USER_ADD_MEM_REG;
> - vhost_user_fill_msg_region(®ion_buffer, reg);
> + vhost_user_fill_msg_region(®ion_buffer, reg, offset);
> msg->payload.mem_reg.region = region_buffer;
> - msg->payload.mem_reg.region.mmap_offset = offset;
>
> if (vhost_user_write(dev, msg, &fd, 1) < 0) {
> return -1;
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-06-22 21:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-22 18:41 [PATCH] Stop vhost-user sending uninitialized mmap_offsets Raphael Norwitz
2020-06-22 21:30 ` Michael S. Tsirkin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.