[PATCH] drm/amd/display: Fix error pointers in amdgpu_dm_crtc_mem_type_changed
Li, Roman
Roman.Li at amd.com
Mon Jan 20 16:42:56 UTC 2025
[Public]
Reviewed-by: Roman Li <roman.li at amd.com>
> -----Original Message-----
> From: SHANMUGAM, SRINIVASAN <SRINIVASAN.SHANMUGAM at amd.com>
> Sent: Wednesday, January 15, 2025 12:07 PM
> To: Siqueira, Rodrigo <Rodrigo.Siqueira at amd.com>; Pillai, Aurabindo
> <Aurabindo.Pillai at amd.com>
> Cc: amd-gfx at lists.freedesktop.org; SHANMUGAM, SRINIVASAN
> <SRINIVASAN.SHANMUGAM at amd.com>; Li, Sun peng (Leo)
> <Sunpeng.Li at amd.com>; Chung, ChiaHsuan (Tom)
> <ChiaHsuan.Chung at amd.com>; Li, Roman <Roman.Li at amd.com>; Hung, Alex
> <Alex.Hung at amd.com>; Wentland, Harry <Harry.Wentland at amd.com>; Hamza
> Mahfooz <hamza.mahfooz at amd.com>; Dan Carpenter <dan.carpenter at linaro.org>
> Subject: [PATCH] drm/amd/display: Fix error pointers in
> amdgpu_dm_crtc_mem_type_changed
>
> The function amdgpu_dm_crtc_mem_type_changed was dereferencing pointers
> returned by drm_atomic_get_plane_state without checking for errors. This could lead
> to undefined behavior if the function returns an error pointer.
>
> This commit adds checks using IS_ERR to ensure that new_plane_state and
> old_plane_state are valid before dereferencing them.
>
> Fixes the below:
>
> drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:11486
> amdgpu_dm_crtc_mem_type_changed()
> error: 'new_plane_state' dereferencing possible ERR_PTR()
>
> drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c
> 11475 static bool amdgpu_dm_crtc_mem_type_changed(struct drm_device *dev,
> 11476 struct drm_atomic_state *state,
> 11477 struct drm_crtc_state *crtc_state)
> 11478 {
> 11479 struct drm_plane *plane;
> 11480 struct drm_plane_state *new_plane_state, *old_plane_state;
> 11481
> 11482 drm_for_each_plane_mask(plane, dev, crtc_state->plane_mask) {
> 11483 new_plane_state = drm_atomic_get_plane_state(state, plane);
> 11484 old_plane_state = drm_atomic_get_plane_state(state, plane);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^ These functions can fail.
>
> 11485
> --> 11486 if (old_plane_state->fb && new_plane_state->fb &&
> 11487 get_mem_type(old_plane_state->fb) !=
> get_mem_type(new_plane_state->fb))
> 11488 return true;
> 11489 }
> 11490
> 11491 return false;
> 11492 }
>
> Fixes: 1079bd90c55b ("drm/amd/display: Do not elevate mem_type change to full
> update")
> Cc: Leo Li <sunpeng.li at amd.com>
> 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: 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>
> Reported-by: Dan Carpenter <dan.carpenter at linaro.org>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam at amd.com>
> ---
> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index fe75fbced027..f3f319238763 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -11523,6 +11523,11 @@ static bool
> amdgpu_dm_crtc_mem_type_changed(struct drm_device *dev,
> new_plane_state = drm_atomic_get_plane_state(state, plane);
> old_plane_state = drm_atomic_get_plane_state(state, plane);
>
> + if (IS_ERR(new_plane_state) || IS_ERR(old_plane_state)) {
> + DRM_ERROR("Failed to get plane state for plane %s\n",
> plane->name);
> + return false;
> + }
> +
> if (old_plane_state->fb && new_plane_state->fb &&
> get_mem_type(old_plane_state->fb) !=
> get_mem_type(new_plane_state->fb))
> return true;
> --
> 2.34.1
More information about the amd-gfx
mailing list