[Spice-devel] [PATCH] worker: handle red_get_surface_cmd() error explicitely
Christophe Fergeau
cfergeau at redhat.com
Mon Oct 7 14:52:01 CEST 2013
ACK
On Mon, Oct 07, 2013 at 01:53:47PM +0200, Marc-André Lureau wrote:
> 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
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20131007/c92c7aaf/attachment-0001.pgp>
More information about the Spice-devel
mailing list