Linux ACPI
 help / color / mirror / Atom feed
* [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters
@ 2026-07-08  7:07 Kate Hsuan
  0 siblings, 0 replies; 4+ messages in thread
From: Kate Hsuan @ 2026-07-08  7:07 UTC (permalink / raw)
  To: hpa; +Cc: linux-acpi, linux-kernel

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��

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@redhat.com>
---
 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;
+
+	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;
 }
 
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters
@ 2026-07-08  7:07 Kate Hsuan
  2026-07-09 13:38 ` Rafael J. Wysocki (Intel)
  0 siblings, 1 reply; 4+ messages in thread
From: Kate Hsuan @ 2026-07-08  7:07 UTC (permalink / raw)
  To: Mark Pearson, Rafael J . Wysocki, Len Brown
  Cc: linux-acpi, linux-kernel, Kate Hsuan

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��

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@redhat.com>
---
 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;
+
+	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;
 }
 
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters
  2026-07-08  7:07 [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters Kate Hsuan
@ 2026-07-09 13:38 ` Rafael J. Wysocki (Intel)
  2026-07-10  7:02   ` Kate Hsuan
  0 siblings, 1 reply; 4+ messages in thread
From: Rafael J. Wysocki (Intel) @ 2026-07-09 13:38 UTC (permalink / raw)
  To: Kate Hsuan
  Cc: Mark Pearson, Rafael J . Wysocki, Len Brown, linux-acpi,
	linux-kernel

On Wed, Jul 8, 2026 at 9:07 AM Kate Hsuan <hpa@redhat.com> 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@redhat.com>
> ---
>  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;
>  }
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters
  2026-07-09 13:38 ` Rafael J. Wysocki (Intel)
@ 2026-07-10  7:02   ` Kate Hsuan
  0 siblings, 0 replies; 4+ messages in thread
From: Kate Hsuan @ 2026-07-10  7:02 UTC (permalink / raw)
  To: Rafael J. Wysocki (Intel)
  Cc: Mark Pearson, Len Brown, linux-acpi, linux-kernel

Hi Rafael,

Thank you for the review.

On Thu, Jul 9, 2026 at 9:38 PM Rafael J. Wysocki (Intel)
<rafael@kernel.org> wrote:
>
> On Wed, Jul 8, 2026 at 9:07 AM Kate Hsuan <hpa@redhat.com> 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@redhat.com>
> > ---
> >  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


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-07-10  7:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-08  7:07 [PATCH] acpi: battery: Sanitise model_number by dropping unprintable characters Kate Hsuan
2026-07-09 13:38 ` Rafael J. Wysocki (Intel)
2026-07-10  7:02   ` Kate Hsuan
  -- strict thread matches above, loose matches on Subject: below --
2026-07-08  7:07 Kate Hsuan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox