aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <jeffpc@josefsipek.net>2024-04-16 23:01:28 +0000
committerEd Maste <emaste@FreeBSD.org>2024-04-19 03:16:52 +0000
commit788987e034b1c73d779a3aa179f79f672bbdb366 (patch)
tree3834ab6e7100537ce7ff6d9948fdb1a426fa93c9
parent7a2c2599a760156d8ef8bdf741adc1abd4ad26fc (diff)
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)
-rw-r--r--sys/dev/acpica/acpi_battery.c9
1 files changed, 8 insertions, 1 deletions
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;