Re: [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters
From: Kate Hsuan
Date: Fri Jul 10 2026 - 03:04:57 EST
Hi Rafael,
Thank you for the review.
On Thu, Jul 9, 2026 at 9:38 PM Rafael J. Wysocki (Intel)
<rafael@xxxxxxxxxx> wrote:
>
> 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.
You are right. I'll find the first unprintable character and replace
it with a NUL and break the loop.
>
> > 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.
Okay
>
> > + 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;
> > }
> >
>
--
BR,
Kate