Re: [PATCH v4 1/5] drm/xe/xe_late_bind_fw: Fix firmware leak on missing manifest entry
Daniele Ceraolo Spurio <[email protected]> Mon, 3 Aug 2026 15:31:45 -0700
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
On 7/23/2026 1:37 AM, Badal Nilawar wrote:
> Release firmware when the "LTES" manifest entry is not found in the
> firmware header.
>
> Fixes: efa29317a553 ("drm/xe/xe_late_bind_fw: Extract and print version info")
> Signed-off-by: Badal Nilawar <[email protected]>
> ---
> drivers/gpu/drm/xe/xe_late_bind_fw.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_late_bind_fw.c b/drivers/gpu/drm/xe/xe_late_bind_fw.c
> index 768442ca7da6..1529a1de4051 100644
> --- a/drivers/gpu/drm/xe/xe_late_bind_fw.c
> +++ b/drivers/gpu/drm/xe/xe_late_bind_fw.c
> @@ -335,19 +335,19 @@ static int __xe_late_bind_fw_init(struct xe_late_bind *late_bind, u32 fw_id)
> if (fw->size > XE_LB_MAX_PAYLOAD_SIZE) {
> drm_err(&xe->drm, "Firmware %s size %zu is larger than max pay load size %u\n",
> lb_fw->blob_path, fw->size, XE_LB_MAX_PAYLOAD_SIZE);
> - release_firmware(fw);
> - return -ENODATA;
> + ret = -ENODATA;
> + goto release_fw;
> }
>
> ret = parse_lb_layout(lb_fw, fw->data, fw->size, "LTES");
> if (ret)
> - return ret;
> + goto release_fw;
>
> lb_fw->payload_size = fw->size;
> lb_fw->payload = drmm_kzalloc(&xe->drm, lb_fw->payload_size, GFP_KERNEL);
> if (!lb_fw->payload) {
> - release_firmware(fw);
> - return -ENOMEM;
> + ret = -ENOMEM;
> + goto release_fw;
> }
>
> drm_info(&xe->drm, "Using %s firmware from %s version %u.%u.%u.%u\n",
> @@ -359,7 +359,9 @@ static int __xe_late_bind_fw_init(struct xe_late_bind *late_bind, u32 fw_id)
> release_firmware(fw);
> INIT_WORK(&lb_fw->work, xe_late_bind_work);
>
> - return 0;
> +release_fw:
> + release_firmware(fw);
shouldn't the release_firmware a few lines above be dropped? Otherwise
you're calling it twice in the successful case.
Daniele
> + return ret;
> }
>
> static int xe_late_bind_fw_init(struct xe_late_bind *late_bind)