[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 14/23] virtio-gpu: Add virtio_gpu_find_check_resource
From: |
Gerd Hoffmann |
Subject: |
[PULL 14/23] virtio-gpu: Add virtio_gpu_find_check_resource |
Date: |
Thu, 27 May 2021 16:23:31 +0200 |
From: Vivek Kasireddy <vivek.kasireddy@intel.com>
Move finding the resource and validating its backing storage into one
function.
Based-on-patch-by: Gerd Hoffmann <kraxel@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Message-Id: <20210526231429.1045476-6-vivek.kasireddy@intel.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/display/virtio-gpu.c | 66 +++++++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 19 deletions(-)
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index db56f0454a8a..7b5296f0d088 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -35,6 +35,10 @@
static struct virtio_gpu_simple_resource*
virtio_gpu_find_resource(VirtIOGPU *g, uint32_t resource_id);
+static struct virtio_gpu_simple_resource *
+virtio_gpu_find_check_resource(VirtIOGPU *g, uint32_t resource_id,
+ bool require_backing,
+ const char *caller, uint32_t *error);
static void virtio_gpu_cleanup_mapping(VirtIOGPU *g,
struct virtio_gpu_simple_resource *res);
@@ -46,7 +50,8 @@ void virtio_gpu_update_cursor_data(VirtIOGPU *g,
struct virtio_gpu_simple_resource *res;
uint32_t pixels;
- res = virtio_gpu_find_resource(g, resource_id);
+ res = virtio_gpu_find_check_resource(g, resource_id, false,
+ __func__, NULL);
if (!res) {
return;
}
@@ -114,6 +119,37 @@ virtio_gpu_find_resource(VirtIOGPU *g, uint32_t
resource_id)
return NULL;
}
+static struct virtio_gpu_simple_resource *
+virtio_gpu_find_check_resource(VirtIOGPU *g, uint32_t resource_id,
+ bool require_backing,
+ const char *caller, uint32_t *error)
+{
+ struct virtio_gpu_simple_resource *res;
+
+ res = virtio_gpu_find_resource(g, resource_id);
+ if (!res) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid resource specified %d\n",
+ caller, resource_id);
+ if (error) {
+ *error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ }
+ return NULL;
+ }
+
+ if (require_backing) {
+ if (!res->iov || !res->image) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no backing storage %d\n",
+ caller, resource_id);
+ if (error) {
+ *error = VIRTIO_GPU_RESP_ERR_UNSPEC;
+ }
+ return NULL;
+ }
+ }
+
+ return res;
+}
+
void virtio_gpu_ctrl_response(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd,
struct virtio_gpu_ctrl_hdr *resp,
@@ -352,11 +388,9 @@ static void virtio_gpu_transfer_to_host_2d(VirtIOGPU *g,
virtio_gpu_t2d_bswap(&t2d);
trace_virtio_gpu_cmd_res_xfer_toh_2d(t2d.resource_id);
- res = virtio_gpu_find_resource(g, t2d.resource_id);
- if (!res || !res->iov) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal resource specified %d\n",
- __func__, t2d.resource_id);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ res = virtio_gpu_find_check_resource(g, t2d.resource_id, true,
+ __func__, &cmd->error);
+ if (!res) {
return;
}
@@ -410,11 +444,9 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
trace_virtio_gpu_cmd_res_flush(rf.resource_id,
rf.r.width, rf.r.height, rf.r.x, rf.r.y);
- res = virtio_gpu_find_resource(g, rf.resource_id);
+ res = virtio_gpu_find_check_resource(g, rf.resource_id, false,
+ __func__, &cmd->error);
if (!res) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal resource specified %d\n",
- __func__, rf.resource_id);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
return;
}
@@ -497,11 +529,9 @@ static void virtio_gpu_set_scanout(VirtIOGPU *g,
}
/* create a surface for this scanout */
- res = virtio_gpu_find_resource(g, ss.resource_id);
+ res = virtio_gpu_find_check_resource(g, ss.resource_id, true,
+ __func__, &cmd->error);
if (!res) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal resource specified %d\n",
- __func__, ss.resource_id);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
return;
}
@@ -709,11 +739,9 @@ virtio_gpu_resource_detach_backing(VirtIOGPU *g,
virtio_gpu_bswap_32(&detach, sizeof(detach));
trace_virtio_gpu_cmd_res_back_detach(detach.resource_id);
- res = virtio_gpu_find_resource(g, detach.resource_id);
- if (!res || !res->iov) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: illegal resource specified %d\n",
- __func__, detach.resource_id);
- cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
+ res = virtio_gpu_find_check_resource(g, detach.resource_id, true,
+ __func__, &cmd->error);
+ if (!res) {
return;
}
virtio_gpu_cleanup_mapping(g, res);
--
2.31.1
- [PULL 04/23] vhost-user-gpu: fix memory leak while calling 'vg_resource_unref' (CVE-2021-3544), (continued)
- [PULL 04/23] vhost-user-gpu: fix memory leak while calling 'vg_resource_unref' (CVE-2021-3544), Gerd Hoffmann, 2021/05/27
- [PULL 06/23] vhost-user-gpu: fix memory leak in 'virgl_resource_attach_backing' (CVE-2021-3544), Gerd Hoffmann, 2021/05/27
- [PULL 05/23] vhost-user-gpu: fix memory leak in 'virgl_cmd_resource_unref' (CVE-2021-3544), Gerd Hoffmann, 2021/05/27
- [PULL 08/23] vhost-user-gpu: abstract vg_cleanup_mapping_iov, Gerd Hoffmann, 2021/05/27
- [PULL 07/23] vhost-user-gpu: fix OOB write in 'virgl_cmd_get_capset' (CVE-2021-3546), Gerd Hoffmann, 2021/05/27
- [PULL 11/23] headers: Add udmabuf.h, Gerd Hoffmann, 2021/05/27
- [PULL 10/23] ui: Get the fd associated with udmabuf driver, Gerd Hoffmann, 2021/05/27
- [PULL 12/23] virtio-gpu: Add udmabuf helpers, Gerd Hoffmann, 2021/05/27
- [PULL 09/23] hw/display/qxl: Set pci rom address aligned with page size, Gerd Hoffmann, 2021/05/27
- [PULL 13/23] stubs: Add stubs for udmabuf helpers, Gerd Hoffmann, 2021/05/27
- [PULL 14/23] virtio-gpu: Add virtio_gpu_find_check_resource,
Gerd Hoffmann <=
- [PULL 16/23] virtio-gpu: Refactor virtio_gpu_create_mapping_iov, Gerd Hoffmann, 2021/05/27
- [PULL 15/23] virtio-gpu: Refactor virtio_gpu_set_scanout, Gerd Hoffmann, 2021/05/27
- [PULL 17/23] virtio-gpu: Add initial definitions for blob resources, Gerd Hoffmann, 2021/05/27
- [PULL 18/23] virtio-gpu: Add virtio_gpu_resource_create_blob, Gerd Hoffmann, 2021/05/27
- [PULL 19/23] ui/pixman: Add qemu_pixman_to_drm_format(), Gerd Hoffmann, 2021/05/27
- [PULL 21/23] virtio-gpu: Factor out update scanout, Gerd Hoffmann, 2021/05/27
- [PULL 23/23] virtio-gpu: Update cursor data using blob, Gerd Hoffmann, 2021/05/27
- [PULL 20/23] virtio-gpu: Add helpers to create and destroy dmabuf objects, Gerd Hoffmann, 2021/05/27
- [PULL 22/23] virtio-gpu: Add virtio_gpu_set_scanout_blob, Gerd Hoffmann, 2021/05/27
- Re: [PULL 00/23] Vga 20210527 patches, Peter Maydell, 2021/05/30