* [PATCH] drm/i915/backlight: Return immediately when scale() finds invalid parameters
@ 2025-01-21 6:17 Guenter Roeck
2025-01-21 8:03 ` Jani Nikula
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2025-01-21 6:17 UTC (permalink / raw)
To: Jani Nikula
Cc: Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, David Airlie,
Simona Vetter, intel-gfx, intel-xe, dri-devel, linux-kernel,
Guenter Roeck, Linus Torvalds, David Laight, Andy Shevchenko
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>
---
drivers/gpu/drm/i915/display/intel_backlight.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c
index 3f81a726cc7d..ad49bd4a1c12 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_backlight.c
@@ -40,8 +40,11 @@ static u32 scale(u32 source_val,
{
u64 target_val;
- WARN_ON(source_min > source_max);
- WARN_ON(target_min > target_max);
+ if (WARN_ON(target_min > target_max))
+ return target_min;
+
+ if (WARN_ON(source_min > source_max) || source_min == source_max)
+ return target_min + (target_max - target_min) / 2;
/* defensive */
source_val = clamp(source_val, source_min, source_max);
--
2.45.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] drm/i915/backlight: Return immediately when scale() finds invalid parameters
2025-01-21 6:17 [PATCH] drm/i915/backlight: Return immediately when scale() finds invalid parameters Guenter Roeck
@ 2025-01-21 8:03 ` Jani Nikula
0 siblings, 0 replies; 2+ messages in thread
From: Jani Nikula @ 2025-01-21 8:03 UTC (permalink / raw)
To: Guenter Roeck
Cc: Rodrigo Vivi, Joonas Lahtinen, Tvrtko Ursulin, David Airlie,
Simona Vetter, intel-gfx, intel-xe, dri-devel, linux-kernel,
Guenter Roeck, Linus Torvalds, David Laight, Andy Shevchenko
On Mon, 20 Jan 2025, Guenter Roeck <linux@roeck-us.net> wrote:
> 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.
Thanks for the effort in tracking this down.
> 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>
> ---
> drivers/gpu/drm/i915/display/intel_backlight.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c
> index 3f81a726cc7d..ad49bd4a1c12 100644
> --- a/drivers/gpu/drm/i915/display/intel_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_backlight.c
> @@ -40,8 +40,11 @@ static u32 scale(u32 source_val,
> {
> u64 target_val;
>
> - WARN_ON(source_min > source_max);
> - WARN_ON(target_min > target_max);
> + if (WARN_ON(target_min > target_max))
> + return target_min;
> +
> + if (WARN_ON(source_min > source_max) || source_min == source_max)
> + return target_min + (target_max - target_min) / 2;
There's really no need to be this fancy, though. Years down the line
someone's going to think that mean value calculation is something we
need to preserve, but we don't. I'd just return target_max everywhere.
And source_min == source_max could be a warn too.
BR,
Jani.
>
> /* defensive */
> source_val = clamp(source_val, source_min, source_max);
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-01-21 8:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-21 6:17 [PATCH] drm/i915/backlight: Return immediately when scale() finds invalid parameters Guenter Roeck
2025-01-21 8:03 ` Jani Nikula
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox