Re: [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters

From: Rafael J. Wysocki (Intel)

Date: Thu Jul 09 2026 - 09:51:36 EST


On Wed, Jul 8, 2026 at 9:07 AM Kate Hsuan <hpa@xxxxxxxxxx> wrote:
>
> The battery Embedded Controller (EC) may return the model name with
> trailing unprintable or non-ASCII characters. For example, on some systems:
>
> $ cat /sys/class/power_supply/BAT0/model_name
> LNV-5B10W51864��

If they are just trailing and not in the middle of the string, you
could just find the first one and overwrite it with a NUL character.

Rewriting the entire string is overkill in that case.

> Strip these unprintable characters to ensure the model_name attribute
> contains a valid string. If left intact, these malformed strings prevent
> udev rules and hwdb from matching the attribute correctly.
>
> Link: https://gitlab.freedesktop.org/upower/upower/-/work_items/345
>
> Signed-off-by: Kate Hsuan <hpa@xxxxxxxxxx>
> ---
> drivers/acpi/battery.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
> index f5e0eb299610..dea0c3cc5160 100644
> --- a/drivers/acpi/battery.c
> +++ b/drivers/acpi/battery.c
> @@ -10,6 +10,7 @@
>
> #define pr_fmt(fmt) "ACPI: battery: " fmt
>
> +#include <linux/ctype.h>
> #include <linux/delay.h>
> #include <linux/dmi.h>
> #include <linux/jiffies.h>
> @@ -194,6 +195,21 @@ static int acpi_battery_handle_discharging(struct acpi_battery *battery)
> return POWER_SUPPLY_STATUS_DISCHARGING;
> }
>
> +static void acpi_battery_remove_special_chars(char *str)
> +{
> + char *out = str;
> + unsigned int i = 0;
> +

And I would use a for () loop below anyway.

> + while (*str && i < MAX_STRING_LENGTH) {
> + unsigned char c = *str++;
> +
> + if (isascii(c) && isprint(c))
> + *out++ = c;
> + i++;
> + }
> + *out = '\0';
> +}
> +
> static int acpi_battery_get_property(struct power_supply *psy,
> enum power_supply_property psp,
> union power_supply_propval *val)
> @@ -524,6 +540,9 @@ static int extract_battery_info(const int use_bix,
> battery->capacity_now > battery->full_charge_capacity)
> battery->capacity_now = battery->full_charge_capacity;
>
> + if (!result)
> + acpi_battery_remove_special_chars(battery->model_number);
> +
> return result;
> }
>