git: 788987e034b1 - stable/14 - acpi_battery: avoid divide-by-zero when no devices have capacity info

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Fri, 19 Apr 2024 03:17:25 UTC
The branch stable/14 has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=788987e034b1c73d779a3aa179f79f672bbdb366

commit 788987e034b1c73d779a3aa179f79f672bbdb366
Author:     Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
AuthorDate: 2024-04-16 23:01:28 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2024-04-19 03:16:52 +0000

    acpi_battery: avoid divide-by-zero when no devices have capacity info
    
    On laptops with builtin batteries, disconnecting the battery may show up
    as a battery without any capacity information. (The theory is that one
    is disconnecting the cells but the electronics identifying the battery
    are still connected.) As a result, the loop over all batteries in
    acpi_battery_get_battinfo results in total_lfcap == 0.
    
    So, just check that total_lfcap is non-zero to avoid a division by zero
    (triggerable by sysctl hw.acpi.battery).
    
    Reported by:    Stefano Marinelli
    Tested by:      Stefano Marinelli
    Reviewed by:    emaste
    Differential Revision: https://reviews.freebsd.org/D44818
    
    (cherry picked from commit 2e850b832f5d2adb9b230d191277d67c00caaab9)
---
 sys/dev/acpica/acpi_battery.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/sys/dev/acpica/acpi_battery.c b/sys/dev/acpica/acpi_battery.c
index 7455c6afc6a6..cfd8261d5eab 100644
--- a/sys/dev/acpica/acpi_battery.c
+++ b/sys/dev/acpica/acpi_battery.c
@@ -266,7 +266,14 @@ acpi_battery_get_battinfo(device_t dev, struct acpi_battinfo *battinfo)
      */
     if (valid_units > 0) {
 	if (dev == NULL) {
-	    battinfo->cap = (total_cap * 100) / total_lfcap;
+	    /*
+	     * Avoid division by zero if none of the batteries had valid
+	     * capacity info.
+	     */
+	    if (total_lfcap > 0)
+		battinfo->cap = (total_cap * 100) / total_lfcap;
+	    else
+		battinfo->cap = 0;
 	    battinfo->min = total_min;
 	    battinfo->state = batt_stat;
 	    battinfo->rate = valid_rate;