Message ID | 20230103125726.681099-1-yangyingliang@huawei.com |
---|---|
State | Accepted |
Commit | 1b6599f741a4525ca761ecde46e5885ff1e6ba58 |
Headers | show |
Series | powercap: fix possible name leak in powercap_register_zone() | expand |
On Tue, Jan 3, 2023 at 1:38 PM Yang Yingliang <yangyingliang@huawei.com> wrote: > > In the error path after calling dev_set_name(), the device > name is leaked. To fix this, calling dev_set_name() before > device_register(), and call put_device() if it returns error. > All the resources is released in powercap_release(), so it > can return from powercap_register_zone() directly. > > Fixes: 75d2364ea0ca ("PowerCap: Add class driver") > Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> > --- > drivers/powercap/powercap_sys.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c > index 1f968353d479..e180dee0f83d 100644 > --- a/drivers/powercap/powercap_sys.c > +++ b/drivers/powercap/powercap_sys.c > @@ -530,9 +530,6 @@ struct powercap_zone *powercap_register_zone( > power_zone->name = kstrdup(name, GFP_KERNEL); > if (!power_zone->name) > goto err_name_alloc; > - dev_set_name(&power_zone->dev, "%s:%x", > - dev_name(power_zone->dev.parent), > - power_zone->id); > power_zone->constraints = kcalloc(nr_constraints, > sizeof(*power_zone->constraints), > GFP_KERNEL); > @@ -555,9 +552,16 @@ struct powercap_zone *powercap_register_zone( > power_zone->dev_attr_groups[0] = &power_zone->dev_zone_attr_group; > power_zone->dev_attr_groups[1] = NULL; > power_zone->dev.groups = power_zone->dev_attr_groups; > + dev_set_name(&power_zone->dev, "%s:%x", > + dev_name(power_zone->dev.parent), > + power_zone->id); > result = device_register(&power_zone->dev); > - if (result) > - goto err_dev_ret; > + if (result) { > + put_device(&power_zone->dev); > + mutex_unlock(&control_type->lock); > + > + return ERR_PTR(result); > + } > > control_type->nr_zones++; > mutex_unlock(&control_type->lock); > -- Applied as 6.3 material, thanks!
diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c index 1f968353d479..e180dee0f83d 100644 --- a/drivers/powercap/powercap_sys.c +++ b/drivers/powercap/powercap_sys.c @@ -530,9 +530,6 @@ struct powercap_zone *powercap_register_zone( power_zone->name = kstrdup(name, GFP_KERNEL); if (!power_zone->name) goto err_name_alloc; - dev_set_name(&power_zone->dev, "%s:%x", - dev_name(power_zone->dev.parent), - power_zone->id); power_zone->constraints = kcalloc(nr_constraints, sizeof(*power_zone->constraints), GFP_KERNEL); @@ -555,9 +552,16 @@ struct powercap_zone *powercap_register_zone( power_zone->dev_attr_groups[0] = &power_zone->dev_zone_attr_group; power_zone->dev_attr_groups[1] = NULL; power_zone->dev.groups = power_zone->dev_attr_groups; + dev_set_name(&power_zone->dev, "%s:%x", + dev_name(power_zone->dev.parent), + power_zone->id); result = device_register(&power_zone->dev); - if (result) - goto err_dev_ret; + if (result) { + put_device(&power_zone->dev); + mutex_unlock(&control_type->lock); + + return ERR_PTR(result); + } control_type->nr_zones++; mutex_unlock(&control_type->lock);
In the error path after calling dev_set_name(), the device name is leaked. To fix this, calling dev_set_name() before device_register(), and call put_device() if it returns error. All the resources is released in powercap_release(), so it can return from powercap_register_zone() directly. Fixes: 75d2364ea0ca ("PowerCap: Add class driver") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> --- drivers/powercap/powercap_sys.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)