> Subject: [PATCH 04/13] drm/i915/display: Fix color pipeline enum name leak
>
> intel_color_pipeline_plane_init() allocates enum names for color pipelines,
> which are copied by drm_property_create_enum(). The temporary strings were
> not freed, resulting in a memory leak.
>
> Allocate enum names only after successful pipeline construction and free them
> on all exit paths.
>
> Fixes: ef105316819d ("drm/i915/color: Create a transfer function color
> pipeline")
> Signed-off-by: Chaitanya Kumar Borah <[email protected]>
LGTM,
Reviewed-by: Suraj Kandpal <[email protected]>
> ---
> .../drm/i915/display/intel_color_pipeline.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_color_pipeline.c
> b/drivers/gpu/drm/i915/display/intel_color_pipeline.c
> index 684641c8323b..04af552b3648 100644
> --- a/drivers/gpu/drm/i915/display/intel_color_pipeline.c
> +++ b/drivers/gpu/drm/i915/display/intel_color_pipeline.c
> @@ -34,7 +34,6 @@ int _intel_color_pipeline_plane_init(struct drm_plane
> *plane, struct drm_prop_en
> return ret;
>
> list->type = colorop->base.base.id;
> - list->name = kasprintf(GFP_KERNEL, "Color Pipeline %d", colorop-
> >base.base.id);
>
> /* TODO: handle failures and clean up */
> prev_op = &colorop->base;
> @@ -74,6 +73,8 @@ int _intel_color_pipeline_plane_init(struct drm_plane
> *plane, struct drm_prop_en
>
> drm_colorop_set_next_property(prev_op, &colorop->base);
>
> + list->name = kasprintf(GFP_KERNEL, "Color Pipeline %d", list->type);
> +
> return 0;
> }
>
> @@ -81,9 +82,10 @@ int intel_color_pipeline_plane_init(struct drm_plane
> *plane, enum pipe pipe) {
> struct drm_device *dev = plane->dev;
> struct intel_display *display = to_intel_display(dev);
> - struct drm_prop_enum_list pipelines[MAX_COLOR_PIPELINES];
> + struct drm_prop_enum_list pipelines[MAX_COLOR_PIPELINES] = {};
> int len = 0;
> - int ret;
> + int ret = 0;
> + int i;
>
> /* Currently expose pipeline only for HDR planes */
> if (!icl_is_hdr_plane(display, to_intel_plane(plane)->id)) @@ -92,8
> +94,14 @@ int intel_color_pipeline_plane_init(struct drm_plane *plane, enum
> pipe pipe)
> /* Add pipeline consisting of transfer functions */
> ret = _intel_color_pipeline_plane_init(plane, &pipelines[len], pipe);
> if (ret)
> - return ret;
> + goto out;
> len++;
>
> - return drm_plane_create_color_pipeline_property(plane, pipelines,
> len);
> + ret = drm_plane_create_color_pipeline_property(plane, pipelines, len);
> +
> + for (i = 0; i < len; i++)
> + kfree(pipelines[i].name);
> +
> +out:
> + return ret;
> }
> --
> 2.25.1