From 1e2d54b1c946075590d011da17d96796ede58894 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sun, 8 Jun 2025 21:37:59 +0200 Subject: [PATCH 05/10] fixup! power: supply: core: battery-info: fully switch to fwnode propname must NOT be manually free-ed here since it is marked __free(kfree), freeing it will cause a double-free bug. Also move propdata to be a __free(kfree) value for consistency and also for cleaner code. Signed-off-by: Hans de Goede --- drivers/power/supply/power_supply_core.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index 9bbc3be2e483..f2c79f15838d 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -588,7 +588,7 @@ int power_supply_get_battery_info(struct power_supply *psy, struct fwnode_handle *srcnode, *fwnode; const char *value; int err, len, index, proplen; - u32 *propdata; + u32 *propdata __free(kfree) = NULL; u32 min_max[2]; srcnode = dev_fwnode(&psy->dev); @@ -758,9 +758,9 @@ int power_supply_get_battery_info(struct power_supply *psy, err = -EINVAL; goto out_put_node; } - propdata = kcalloc(proplen, sizeof(*propdata), GFP_KERNEL); + + u32 *propdata __free(kfree) = kcalloc(proplen, sizeof(*propdata), GFP_KERNEL); if (!propdata) { - kfree(propname); power_supply_put_battery_info(psy, info); err = -EINVAL; goto out_put_node; @@ -768,8 +768,6 @@ int power_supply_get_battery_info(struct power_supply *psy, err = fwnode_property_read_u32_array(fwnode, propname, propdata, proplen); if (err < 0) { dev_err(&psy->dev, "failed to get %s\n", propname); - kfree(propname); - kfree(propdata); power_supply_put_battery_info(psy, info); goto out_put_node; } @@ -780,7 +778,6 @@ int power_supply_get_battery_info(struct power_supply *psy, info->ocv_table[index] = table = devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); if (!info->ocv_table[index]) { - kfree(propdata); power_supply_put_battery_info(psy, info); err = -ENOMEM; goto out_put_node; @@ -790,8 +787,6 @@ int power_supply_get_battery_info(struct power_supply *psy, table[i].ocv = propdata[i*2]; table[i].capacity = propdata[i*2+1]; } - - kfree(propdata); } proplen = fwnode_property_count_u32(fwnode, "resistance-temp-table"); @@ -814,7 +809,6 @@ int power_supply_get_battery_info(struct power_supply *psy, err = fwnode_property_read_u32_array(fwnode, "resistance-temp-table", propdata, proplen); if (err < 0) { - kfree(propdata); power_supply_put_battery_info(psy, info); goto out_put_node; } @@ -825,7 +819,6 @@ int power_supply_get_battery_info(struct power_supply *psy, sizeof(*resist_table), GFP_KERNEL); if (!info->resist_table) { - kfree(propdata); power_supply_put_battery_info(psy, info); err = -ENOMEM; goto out_put_node; @@ -836,8 +829,6 @@ int power_supply_get_battery_info(struct power_supply *psy, resist_table[index].resistance = propdata[index*2+1]; } - kfree(propdata); - out_ret_pointer: /* Finally return the whole thing */ *info_out = info; -- 2.49.0