]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/backlight: Return immediately when scale() finds invalid parameters
authorGuenter Roeck <linux@roeck-us.net>
Tue, 21 Jan 2025 14:52:03 +0000 (06:52 -0800)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 3 Feb 2025 14:29:40 +0000 (09:29 -0500)
The scale() functions detects invalid parameters, but continues
its calculations anyway. This causes bad results if negative values
are used for unsigned operations. Worst case, a division by 0 error
will be seen if source_min == source_max.

On top of that, after v6.13, the sequence of WARN_ON() followed by clamp()
may result in a build error with gcc 13.x.

drivers/gpu/drm/i915/display/intel_backlight.c: In function 'scale':
include/linux/compiler_types.h:542:45: error:
call to '__compiletime_assert_415' declared with attribute error:
clamp() low limit source_min greater than high limit source_max

This happens if the compiler decides to rearrange the code as follows.

        if (source_min > source_max) {
                WARN(..);
                /* Do the clamp() knowing that source_min > source_max */
                source_val = clamp(source_val, source_min, source_max);
        } else {
                /* Do the clamp knowing that source_min <= source_max */
                source_val = clamp(source_val, source_min, source_max);
        }

Fix the problem by evaluating the return values from WARN_ON and returning
immediately after a warning. While at it, fix divide by zero error seen
if source_min == source_max.

Analyzed-by: Linus Torvalds <torvalds@linux-foundation.org>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Suggested-by: David Laight <david.laight.linux@gmail.com>
Cc: David Laight <david.laight.linux@gmail.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250121145203.2851237-1-linux@roeck-us.net
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
(cherry picked from commit 6f71507415841d1a6d38118e5fa0eaf0caab9c17)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/display/intel_backlight.c

index fc1e517e074a30295707809debde0b124437a7e8..7e6ce905bdafa2e4905386af3dcbe544da49ef36 100644 (file)
@@ -41,8 +41,9 @@ static u32 scale(u32 source_val,
 {
        u64 target_val;
 
-       WARN_ON(source_min > source_max);
-       WARN_ON(target_min > target_max);
+       if (WARN_ON(source_min >= source_max) ||
+           WARN_ON(target_min > target_max))
+               return target_min;
 
        /* defensive */
        source_val = clamp(source_val, source_min, source_max);