Re: [PATCH v2] acpi: battery: Sanitise model_number by dropping unprintable characters
From: Mark Pearson
Date: Fri Jul 10 2026 - 11:40:39 EST
On Fri, Jul 10, 2026, at 8:51 AM, Kate Hsuan 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 a non-ASCII or an unprintable character is found, it will be replaced
> with '\0' to ensure the model_number is a valid string. If left intact,
> the malformed string prevents udev rules and hwdb working correctly.
>
> Link: https://gitlab.freedesktop.org/upower/upower/-/work_items/345
>
> Signed-off-by: Kate Hsuan <hpa@xxxxxxxxxx>
> ---
> drivers/acpi/battery.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
> index f5e0eb299610..4409fb95b988 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>
> @@ -483,6 +484,15 @@ static int acpi_battery_get_status(struct
> acpi_battery *battery)
> return 0;
> }
>
> +static void acpi_battery_clean_unprintable_chars(char *str, size_t length)
> +{
> + for (unsigned int i = 0; i < length; i++) {
> + if (!isascii(str[i]) || !isprint(str[i])) {
> + str[i] = '\0';
> + break;
> + }
> + }
> +}
>
> static int extract_battery_info(const int use_bix,
> struct acpi_battery *battery,
> @@ -524,6 +534,10 @@ 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_clean_unprintable_chars(battery->model_number,
> + ARRAY_SIZE(battery->model_number));
> +
> return result;
> }
>
> --
> 2.55.0
Thanks Kate - I know this impacts a few of our platforms and it will be great to have this fix.
Implementation looks good to me.
Reviewed-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx>
Mark