[Spice-devel] [PATCH] worker: handle red_get_surface_cmd() error explicitely
Marc-André Lureau
marcandre.lureau at gmail.com
Mon Oct 7 13:53:47 CEST 2013
Don't ignore red_get_surface_cmd() error, and explicitely interrupt and
free cmd before processing.
---
server/red_worker.c | 56 ++++++++++++++++++++++++++++++-----------------------
1 file changed, 32 insertions(+), 24 deletions(-)
diff --git a/server/red_worker.c b/server/red_worker.c
index 8f7a1fc..8763c8e 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -11631,40 +11631,48 @@ void handle_dev_driver_unload(void *opaque, void *payload)
worker->driver_cap_monitors_config = 0;
}
+static int loadvm_command(RedWorker *worker, QXLCommandExt *ext)
+{
+ RedCursorCmd *cursor_cmd;
+ RedSurfaceCmd *surface_cmd;
+
+ switch (ext->cmd.type) {
+ case QXL_CMD_CURSOR:
+ cursor_cmd = spice_new0(RedCursorCmd, 1);
+ if (red_get_cursor_cmd(&worker->mem_slots, ext->group_id, cursor_cmd, ext->cmd.data)) {
+ free(cursor_cmd);
+ return FALSE;
+ }
+ qxl_process_cursor(worker, cursor_cmd, ext->group_id);
+ break;
+ case QXL_CMD_SURFACE:
+ surface_cmd = spice_new0(RedSurfaceCmd, 1);
+ if (red_get_surface_cmd(&worker->mem_slots, ext->group_id, surface_cmd, ext->cmd.data)) {
+ free(surface_cmd);
+ return FALSE;
+ }
+ red_process_surface(worker, surface_cmd, ext->group_id, TRUE);
+ break;
+ default:
+ spice_warning("unhandled loadvm command type (%d)", ext->cmd.type);
+ }
+
+ return TRUE;
+}
+
void handle_dev_loadvm_commands(void *opaque, void *payload)
{
RedWorkerMessageLoadvmCommands *msg = payload;
RedWorker *worker = opaque;
uint32_t i;
- RedCursorCmd *cursor_cmd;
- RedSurfaceCmd *surface_cmd;
uint32_t count = msg->count;
QXLCommandExt *ext = msg->ext;
spice_info("loadvm_commands");
for (i = 0 ; i < count ; ++i) {
- switch (ext[i].cmd.type) {
- case QXL_CMD_CURSOR:
- cursor_cmd = spice_new0(RedCursorCmd, 1);
- if (red_get_cursor_cmd(&worker->mem_slots, ext[i].group_id,
- cursor_cmd, ext[i].cmd.data)) {
- /* XXX allow failure in loadvm? */
- spice_warning("failed loadvm command type (%d)",
- ext[i].cmd.type);
- free(cursor_cmd);
- continue;
- }
- qxl_process_cursor(worker, cursor_cmd, ext[i].group_id);
- break;
- case QXL_CMD_SURFACE:
- surface_cmd = spice_new0(RedSurfaceCmd, 1);
- red_get_surface_cmd(&worker->mem_slots, ext[i].group_id,
- surface_cmd, ext[i].cmd.data);
- red_process_surface(worker, surface_cmd, ext[i].group_id, TRUE);
- break;
- default:
- spice_warning("unhandled loadvm command type (%d)", ext[i].cmd.type);
- break;
+ if (!loadvm_command(worker, &ext[i])) {
+ /* XXX allow failure in loadvm? */
+ spice_warning("failed loadvm command type (%d)", ext[i].cmd.type);
}
}
}
--
1.8.3.1
More information about the Spice-devel
mailing list