On Thu, Dec 04, 2025 at 02:38:27PM +0000, Krzysztof Karas wrote:
> vpos (int) field multiplied by crtc_htotal (u16) may cause
> implicit promotion of the latter and overflow the result causing
> undefined behavior.

How is that undefined?

> 
> Cast the u16 operand to (s32) type to avoid that.
> 
> Signed-off-by: Krzysztof Karas <[email protected]>
> ---
> 
> v4:
> * use s32 cast instead of int;
> 
>  drivers/gpu/drm/drm_vblank.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
> index 32d013c5c8fc..e25dcaa6cad4 100644
> --- a/drivers/gpu/drm/drm_vblank.c
> +++ b/drivers/gpu/drm/drm_vblank.c
> @@ -791,7 +791,7 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal(
>        * since start of scanout at first display scanline. delta_ns
>        * can be negative if start of scanout hasn't happened yet.
>        */
> -     delta_ns = div_s64(1000000LL * (vpos * mode->crtc_htotal + hpos),
> +     delta_ns = div_s64(1000000LL * (vpos * (s32)mode->crtc_htotal + hpos),
>                          mode->crtc_clock);
>  
>       /* Subtract time delta from raw timestamp to get final
> -- 
> 2.34.1

-- 
Ville Syrjälä
Intel

Reply via email to