[PATCH] drm/amd/display: Implement bounds check for stream encoder creation in DCN401
Chung, ChiaHsuan (Tom)
chiahsuan.chung at amd.com
Mon Jul 22 06:00:11 UTC 2024
Reviewed-by: Tom Chung <chiahsuan.chung at amd.com>
On 7/20/2024 12:12 AM, Srinivasan Shanmugam wrote:
> 'stream_enc_regs' array is an array of dcn10_stream_enc_registers
> structures. The array is initialized with four elements, corresponding
> to the four calls to stream_enc_regs() in the array initializer. This
> means that valid indices for this array are 0, 1, 2, and 3.
>
> The error message 'stream_enc_regs' 4 <= 5 below, is indicating that
> there is an attempt to access this array with an index of 5, which is
> out of bounds. This could lead to undefined behavior
>
> Here, eng_id is used as an index to access the stream_enc_regs array. If
> eng_id is 5, this would result in an out-of-bounds access on the
> stream_enc_regs array.
>
> Thus fixing Buffer overflow error in dcn401_stream_encoder_create
>
> Found by smatch:
> drivers/gpu/drm/amd/amdgpu/../display/dc/resource/dcn401/dcn401_resource.c:1209 dcn401_stream_encoder_create() error: buffer overflow 'stream_enc_regs' 4 <= 5
>
> 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>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam at amd.com>
> ---
> .../gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> index d3808c49d298..5ee20753572e 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> @@ -1190,7 +1190,7 @@ static struct stream_encoder *dcn401_stream_encoder_create(
> vpg = dcn401_vpg_create(ctx, vpg_inst);
> afmt = dcn401_afmt_create(ctx, afmt_inst);
>
> - if (!enc1 || !vpg || !afmt) {
> + if (!enc1 || !vpg || !afmt || eng_id >= ARRAY_SIZE(stream_enc_regs)) {
> kfree(enc1);
> kfree(vpg);
> kfree(afmt);
More information about the amd-gfx
mailing list