Message ID | 20220526082856.37594-1-linmq006@gmail.com |
---|---|
State | New |
Headers | show |
Series | devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events | expand |
On 22. 5. 26. 17:28, Miaoqian Lin wrote: > of_get_child_by_name() returns a node pointer with refcount > incremented, we should use of_node_put() on it when done. > This function only calls of_node_put() in normal path, > missing it in error paths. > Add missing of_node_put() to avoid refcount leak. > > Fixes: f262f28c1470 ("PM / devfreq: event: Add devfreq_event class") > Signed-off-by: Miaoqian Lin <linmq006@gmail.com> > --- > drivers/devfreq/event/exynos-ppmu.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c > index 9b849d781116..a443e7c42daf 100644 > --- a/drivers/devfreq/event/exynos-ppmu.c > +++ b/drivers/devfreq/event/exynos-ppmu.c > @@ -519,15 +519,19 @@ static int of_get_devfreq_events(struct device_node *np, > > count = of_get_child_count(events_np); > desc = devm_kcalloc(dev, count, sizeof(*desc), GFP_KERNEL); > - if (!desc) > + if (!desc) { > + of_node_put(events_np); > return -ENOMEM; > + } > info->num_events = count; > > of_id = of_match_device(exynos_ppmu_id_match, dev); > if (of_id) > info->ppmu_type = (enum exynos_ppmu_type)of_id->data; > - else > + else { > + of_node_put(events_np); > return -EINVAL; > + } > > j = 0; > for_each_child_of_node(events_np, node) { Applied it. Thanks.
On 22. 5. 26. 17:28, Miaoqian Lin wrote: > of_get_child_by_name() returns a node pointer with refcount > incremented, we should use of_node_put() on it when done. > This function only calls of_node_put() in normal path, > missing it in error paths. > Add missing of_node_put() to avoid refcount leak. > > Fixes: f262f28c1470 ("PM / devfreq: event: Add devfreq_event class") > Signed-off-by: Miaoqian Lin <linmq006@gmail.com> > --- > drivers/devfreq/event/exynos-ppmu.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c > index 9b849d781116..a443e7c42daf 100644 > --- a/drivers/devfreq/event/exynos-ppmu.c > +++ b/drivers/devfreq/event/exynos-ppmu.c > @@ -519,15 +519,19 @@ static int of_get_devfreq_events(struct device_node *np, > > count = of_get_child_count(events_np); > desc = devm_kcalloc(dev, count, sizeof(*desc), GFP_KERNEL); > - if (!desc) > + if (!desc) { > + of_node_put(events_np); > return -ENOMEM; > + } > info->num_events = count; > > of_id = of_match_device(exynos_ppmu_id_match, dev); > if (of_id) > info->ppmu_type = (enum exynos_ppmu_type)of_id->data; > - else > + else { > + of_node_put(events_np); > return -EINVAL; > + } > > j = 0; > for_each_child_of_node(events_np, node) { I edited the patch title with 'PM / ' prefix in order to keep the consistent style of title as following: PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events
diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c index 9b849d781116..a443e7c42daf 100644 --- a/drivers/devfreq/event/exynos-ppmu.c +++ b/drivers/devfreq/event/exynos-ppmu.c @@ -519,15 +519,19 @@ static int of_get_devfreq_events(struct device_node *np, count = of_get_child_count(events_np); desc = devm_kcalloc(dev, count, sizeof(*desc), GFP_KERNEL); - if (!desc) + if (!desc) { + of_node_put(events_np); return -ENOMEM; + } info->num_events = count; of_id = of_match_device(exynos_ppmu_id_match, dev); if (of_id) info->ppmu_type = (enum exynos_ppmu_type)of_id->data; - else + else { + of_node_put(events_np); return -EINVAL; + } j = 0; for_each_child_of_node(events_np, node) {
of_get_child_by_name() returns a node pointer with refcount incremented, we should use of_node_put() on it when done. This function only calls of_node_put() in normal path, missing it in error paths. Add missing of_node_put() to avoid refcount leak. Fixes: f262f28c1470 ("PM / devfreq: event: Add devfreq_event class") Signed-off-by: Miaoqian Lin <linmq006@gmail.com> --- drivers/devfreq/event/exynos-ppmu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)