[PATCH v2] drm/amd/display: Add null check for set_output_gamma in dcn30_set_output_transfer_func
Chung, ChiaHsuan (Tom)
chiahsuan.chung at amd.com
Tue Jul 23 05:28:58 UTC 2024
Reviewed-by: Tom Chung <chiahsuan.chung at amd.com>
On 7/22/2024 7:48 PM, Srinivasan Shanmugam wrote:
> This commit adds a null check for the set_output_gamma function pointer
> in the dcn30_set_output_transfer_func function. Previously,
> set_output_gamma was being checked for nullity at line 386, but then it
> was being dereferenced without any nullity check at line 401. This
> could potentially lead to a null pointer dereference error if
> set_output_gamma is indeed null.
>
> To fix this, we now ensure that set_output_gamma is not null before
> dereferencing it. We do this by adding a nullity check for
> set_output_gamma before the call to set_output_gamma at line 401. If
> set_output_gamma is null, we log an error message and do not call the
> function.
>
> This fix prevents a potential null pointer dereference error.
>
> drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn30/dcn30_hwseq.c:401 dcn30_set_output_transfer_func()
> error: we previously assumed 'mpc->funcs->set_output_gamma' could be null (see line 386)
>
> drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn30/dcn30_hwseq.c
> 373 bool dcn30_set_output_transfer_func(struct dc *dc,
> 374 struct pipe_ctx *pipe_ctx,
> 375 const struct dc_stream_state *stream)
> 376 {
> 377 int mpcc_id = pipe_ctx->plane_res.hubp->inst;
> 378 struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
> 379 const struct pwl_params *params = NULL;
> 380 bool ret = false;
> 381
> 382 /* program OGAM or 3DLUT only for the top pipe*/
> 383 if (pipe_ctx->top_pipe == NULL) {
> 384 /*program rmu shaper and 3dlut in MPC*/
> 385 ret = dcn30_set_mpc_shaper_3dlut(pipe_ctx, stream);
> 386 if (ret == false && mpc->funcs->set_output_gamma) {
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If this is NULL
>
> 387 if (stream->out_transfer_func.type == TF_TYPE_HWPWL)
> 388 params = &stream->out_transfer_func.pwl;
> 389 else if (pipe_ctx->stream->out_transfer_func.type ==
> 390 TF_TYPE_DISTRIBUTED_POINTS &&
> 391 cm3_helper_translate_curve_to_hw_format(
> 392 &stream->out_transfer_func,
> 393 &mpc->blender_params, false))
> 394 params = &mpc->blender_params;
> 395 /* there are no ROM LUTs in OUTGAM */
> 396 if (stream->out_transfer_func.type == TF_TYPE_PREDEFINED)
> 397 BREAK_TO_DEBUGGER();
> 398 }
> 399 }
> 400
> --> 401 mpc->funcs->set_output_gamma(mpc, mpcc_id, params);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Then it will crash
>
> 402 return ret;
> 403 }
>
> Fixes: d99f13878d6f ("drm/amd/display: Add DCN3 HWSEQ")
> Reported-by: Dan Carpenter <dan.carpenter at linaro.org>
> Cc: Tom Chung <chiahsuan.chung at amd.com>
> Cc: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
> Cc: Roman Li <roman.li at amd.com>
> Cc: Hersen Wu <hersenxs.wu at amd.com>
> Cc: Alex Hung <alex.hung at amd.com>
> Cc: Aurabindo Pillai <aurabindo.pillai at amd.com>
> Cc: Harry Wentland <harry.wentland at amd.com>
> Cc: Hamza Mahfooz <hamza.mahfooz at amd.com>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam at amd.com>
> ---
> v2: s/DRM_ERROR/DC_LOG_ERROR (Tom)
>
> drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> index 98a40d46aaae..42c52284a868 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> @@ -398,7 +398,11 @@ bool dcn30_set_output_transfer_func(struct dc *dc,
> }
> }
>
> - mpc->funcs->set_output_gamma(mpc, mpcc_id, params);
> + if (mpc->funcs->set_output_gamma)
> + mpc->funcs->set_output_gamma(mpc, mpcc_id, params);
> + else
> + DC_LOG_ERROR("%s: set_output_gamma function pointer is NULL.\n", __func__);
> +
> return ret;
> }
>
More information about the amd-gfx
mailing list