drm/amd/display: Fix possible overflow in integer multiplication
authorAlex Hung <alex.hung@amd.com>
Sat, 8 Jun 2024 04:09:53 +0000 (22:09 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 27 Jul 2024 21:31:41 +0000 (17:31 -0400)
[WHAT & HOW]
Integer multiplies integer may overflow in context that expects an
expression of unsigned long long (64 bits). This can be fixed by casting
integer to unsigned long long to force 64 bits results.

This fixes 2 OVERFLOW_BEFORE_WIDEN issues reported by Coverity.

Signed-off-by: Alex Hung <alex.hung@amd.com>
Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource_helpers.c

index 47c8a9fbe75467d4328ec2327f78079dbb48d72d..f5a4e97c40ced260157fe1aef6b11015b43d98fa 100644 (file)
@@ -663,7 +663,7 @@ bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context)
 
                                subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
                                refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
-                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
+                                       pipe->stream->timing.v_total * (unsigned long long)pipe->stream->timing.h_total - (uint64_t)1);
                                refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
                                refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
                        }
@@ -724,7 +724,7 @@ bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int
 
                                subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
                                refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
-                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
+                                       pipe->stream->timing.v_total * (unsigned long long)pipe->stream->timing.h_total - (uint64_t)1);
                                refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
                                refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
                        }