]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
power: supply: cpcap-battery: Fix missing nvmem_device_put() causing reference leak
authorMa Ke <make24@iscas.ac.cn>
Fri, 24 Apr 2026 01:10:13 +0000 (09:10 +0800)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Wed, 3 Jun 2026 20:00:37 +0000 (22:00 +0200)
In cpcap_battery_detect_battery_type(), the reference to an nvmem
device obtained via nvmem_device_find() is not released with
nvmem_device_put() on the success or read-failure paths, causing a
permanent reference leak. The driver’s retry logic on subsequent
battery property reads can compound this leak, preventing the nvmem
device from ever being freed.

Found by code review.

Signed-off-by: Ma Ke <make24@iscas.ac.cn>
Cc: stable@vger.kernel.org
Fixes: fd46821e85de ("power: supply: cpcap-battery: Add battery type auto detection for mapphone devices")
Link: https://patch.msgid.link/20260424011013.879639-1-make24@iscas.ac.cn
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/cpcap-battery.c

index 7b7bdce3162fcb88f46bc3541afcbbd6ff1e430e..59c741993ef8d8105419dd3de7a361e1ebbb61a6 100644 (file)
@@ -439,10 +439,13 @@ static void cpcap_battery_detect_battery_type(struct cpcap_battery_ddata *ddata)
        if (IS_ERR_OR_NULL(nvmem)) {
                ddata->check_nvmem = true;
                dev_info_once(ddata->dev, "Can not find battery nvmem device. Assuming generic lipo battery\n");
-       } else if (nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) {
-               battery_id = 0;
-               ddata->check_nvmem = true;
-               dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generic lipo battery\n");
+       } else {
+               if (nvmem_device_read(nvmem, 2, 1, &battery_id) < 0) {
+                       battery_id = 0;
+                       ddata->check_nvmem = true;
+                       dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generic lipo battery\n");
+               }
+               nvmem_device_put(nvmem);
        }
 
        switch (battery_id) {