Re: [PATCH] drm/amd/display: Add null check for set_output_gamma in dcn30_set_output_transfer_func

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 7/21/2024 2:22 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@xxxxxxxxxx>
Cc: Tom Chung <chiahsuan.chung@xxxxxxx>
Cc: Rodrigo Siqueira <Rodrigo.Siqueira@xxxxxxx>
Cc: Roman Li <roman.li@xxxxxxx>
Cc: Hersen Wu <hersenxs.wu@xxxxxxx>
Cc: Alex Hung <alex.hung@xxxxxxx>
Cc: Aurabindo Pillai <aurabindo.pillai@xxxxxxx>
Cc: Harry Wentland <harry.wentland@xxxxxxx>
Cc: Hamza Mahfooz <hamza.mahfooz@xxxxxxx>
Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@xxxxxxx>
---
  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 eaeeade31ed7..bd807eb79786 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
+		DRM_ERROR("set_output_gamma function pointer is NULL.\n");
Maybe we should use DC_LOG_ERROR() instead of DRM_ERROR() in here.
+
  	return ret;
  }



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux