backlight: handle saved brightness exceeding max brightness

If too high a brightness value has been saved (e.g. due to kernel
mechanism changing from one kernel version to another, or booting the
userspace on another system), the brightness update fails and the
process exits.

Clamp saved brightness between the policy minimum introduced in

commit 7b909d7407
Author: Josh Triplett <josh@joshtriplett.org>
Date:   Tue Mar 11 21:16:33 2014 -0700

    backlight: Avoid restoring brightness to an unreadably dim level

and the absolute maximum.

https://bugs.freedesktop.org/show_bug.cgi?id=78200
This commit is contained in:
Jani Nikula 2014-05-07 12:01:01 +03:00 committed by Zbigniew Jędrzejewski-Szmek
parent 3d89c35c2a
commit 0c9d8f1d4b

View file

@ -229,7 +229,7 @@ static unsigned get_max_brightness(struct udev_device *device) {
* would otherwise force the user to disable state restoration. */
static void clamp_brightness(struct udev_device *device, char **value, unsigned max_brightness) {
int r;
unsigned brightness, new_brightness;
unsigned brightness, new_brightness, min_brightness;
r = safe_atou(*value, &brightness);
if (r < 0) {
@ -237,7 +237,8 @@ static void clamp_brightness(struct udev_device *device, char **value, unsigned
return;
}
new_brightness = MAX3(brightness, 1U, max_brightness/20);
min_brightness = MAX(1U, max_brightness/20);
new_brightness = CLAMP(brightness, min_brightness, max_brightness);
if (new_brightness != brightness) {
char *old_value = *value;
@ -247,7 +248,11 @@ static void clamp_brightness(struct udev_device *device, char **value, unsigned
return;
}
log_debug("Saved brightness %s too low; increasing to %s.", old_value, *value);
log_info("Saved brightness %s %s to %s.", old_value,
new_brightness > brightness ?
"too low; increasing" : "too high; decreasing",
*value);
free(old_value);
}
}