diff options
| author | Tuo Li <islituo@gmail.com> | 2021-08-10 21:07:03 -0700 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2021-08-11 17:19:54 -0400 | 
| commit | 554594567b1fa3da74f88ec7b2dc83d000c58e98 (patch) | |
| tree | 45fc9c6d8f50ef91e8e6e99fee26d3dd017b63ee /drivers/gpu/drm/amd/display | |
| parent | a211260c34cfadc6068fece8c9e99e0fe1e2a2b6 (diff) | |
drm/display: fix possible null-pointer dereference in dcn10_set_clock()
The variable dc->clk_mgr is checked in:
  if (dc->clk_mgr && dc->clk_mgr->funcs->get_clock)
This indicates dc->clk_mgr can be NULL.
However, it is dereferenced in:
    if (!dc->clk_mgr->funcs->get_clock)
To fix this null-pointer dereference, check dc->clk_mgr and the function
pointer dc->clk_mgr->funcs->get_clock earlier, and return if one of them
is NULL.
Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
Signed-off-by: Tuo Li <islituo@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display')
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 11 | 
1 files changed, 5 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 35af0401f256..df8a7718a85f 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c @@ -3641,13 +3641,12 @@ enum dc_status dcn10_set_clock(struct dc *dc,  	struct dc_clock_config clock_cfg = {0};  	struct dc_clocks *current_clocks = &context->bw_ctx.bw.dcn.clk; -	if (dc->clk_mgr && dc->clk_mgr->funcs->get_clock) -				dc->clk_mgr->funcs->get_clock(dc->clk_mgr, -						context, clock_type, &clock_cfg); - -	if (!dc->clk_mgr->funcs->get_clock) +	if (!dc->clk_mgr || !dc->clk_mgr->funcs->get_clock)  		return DC_FAIL_UNSUPPORTED_1; +	dc->clk_mgr->funcs->get_clock(dc->clk_mgr, +		context, clock_type, &clock_cfg); +  	if (clk_khz > clock_cfg.max_clock_khz)  		return DC_FAIL_CLK_EXCEED_MAX; @@ -3665,7 +3664,7 @@ enum dc_status dcn10_set_clock(struct dc *dc,  	else  		return DC_ERROR_UNEXPECTED; -	if (dc->clk_mgr && dc->clk_mgr->funcs->update_clocks) +	if (dc->clk_mgr->funcs->update_clocks)  				dc->clk_mgr->funcs->update_clocks(dc->clk_mgr,  				context, true);  	return DC_OK; | 
