Reviewed-by: Tom Chung <chiahsuan.ch...@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.carpen...@linaro.org>
Cc: Tom Chung <chiahsuan.ch...@amd.com>
Cc: Rodrigo Siqueira <rodrigo.sique...@amd.com>
Cc: Roman Li <roman...@amd.com>
Cc: Hersen Wu <hersenxs...@amd.com>
Cc: Alex Hung <alex.h...@amd.com>
Cc: Aurabindo Pillai <aurabindo.pil...@amd.com>
Cc: Harry Wentland <harry.wentl...@amd.com>
Cc: Hamza Mahfooz <hamza.mahf...@amd.com>
Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmu...@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;
  }

Reply via email to