From f1b6e15252ead1c1f56429c5e3a4aa8442be940a Mon Sep 17 00:00:00 2001 From: David Rosca Date: Thu, 19 Mar 2026 11:03:51 +0100 Subject: [PATCH] frontends/va: Fix leaks when create_video_codec fails Cc: mesa-stable Reviewed-by: Benjamin Cheng (cherry picked from commit 089cd9d88e9bbde7979114993ac856bc4f90a4f4) Part-of: --- .pick_status.json | 2 +- src/gallium/frontends/va/context.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 65844e7921f..940c77bd629 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -5294,7 +5294,7 @@ "description": "frontends/va: Fix leaks when create_video_codec fails", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/frontends/va/context.c b/src/gallium/frontends/va/context.c index 05324f2f59f..385169fd734 100644 --- a/src/gallium/frontends/va/context.c +++ b/src/gallium/frontends/va/context.c @@ -430,18 +430,21 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width, context->surfaces = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal); context->buffers = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal); + mtx_lock(&drv->mutex); + *context_id = handle_table_add(drv->htab, context); + mtx_unlock(&drv->mutex); + if (create_decoder) { mtx_lock(&drv->mutex); context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat); mtx_unlock(&drv->mutex); - if (!context->decoder) + if (!context->decoder) { + vlVaDestroyContext(ctx, *context_id); + *context_id = VA_INVALID_ID; return VA_STATUS_ERROR_ALLOCATION_FAILED; + } } - mtx_lock(&drv->mutex); - *context_id = handle_table_add(drv->htab, context); - mtx_unlock(&drv->mutex); - return VA_STATUS_SUCCESS; }