119
120
static void vhost_user_gpu_update_blocked(VhostUserGPU *g, bool blocked);
121
122
+static size_t
123
+vhost_user_gpu_min_payload_size(VhostUserGpuRequest request)
124
+{
125
+ switch (request) {
126
+ case VHOST_USER_GPU_CURSOR_POS:
127
+ case VHOST_USER_GPU_CURSOR_POS_HIDE:
128
+ return sizeof(VhostUserGpuCursorPos);
129
+ case VHOST_USER_GPU_CURSOR_UPDATE:
130
+ return sizeof(VhostUserGpuCursorUpdate);
131
+ case VHOST_USER_GPU_GET_EDID:
132
+ return sizeof(VhostUserGpuEdidRequest);
133
+ case VHOST_USER_GPU_SCANOUT:
134
+ return sizeof(VhostUserGpuScanout);
135
+ case VHOST_USER_GPU_DMABUF_SCANOUT:
136
+ return sizeof(VhostUserGpuDMABUFScanout);
137
+ case VHOST_USER_GPU_DMABUF_SCANOUT2:
138
+ return sizeof(VhostUserGpuDMABUFScanout2);
139
+ case VHOST_USER_GPU_DMABUF_UPDATE:
140
+ case VHOST_USER_GPU_UPDATE:
141
+ return sizeof(VhostUserGpuUpdate);
142
+ default:
143
+ return 0;
144
+ }
145
+}
146
+
147
static void
148
vhost_user_gpu_handle_cursor(VhostUserGPU *g, VhostUserGpuMsg *msg)
149
{
347
if (m->scanout_id >= g->parent_obj.conf.max_outputs) {
348
break;
349
}
350
+
351
+ if ((uint64_t)m->width * m->height >
352
+ (msg->size - sizeof(VhostUserGpuUpdate)) / sizeof(uint32_t)) {
353
+ error_report("vhost-user-gpu: update payload too small"
354
+ " for %ux%u", m->width, m->height);
355
+ break;
356
+ }
357
+
358
s = &g->parent_obj.scanout[m->scanout_id];
359
con = s->con;
360
pixman_image_t *image =
429
msg->flags = flags;
430
msg->size = size;
431
432
+ if (size < vhost_user_gpu_min_payload_size(request)) {
433
+ error_report("vhost-user-gpu: message %d payload too small", request);
434
+ goto end;
435
+ }
436
+
437
if (request == VHOST_USER_GPU_CURSOR_UPDATE ||
438
request == VHOST_USER_GPU_CURSOR_POS ||
439
request == VHOST_USER_GPU_CURSOR_POS_HIDE) {