Messages in this thread | | | Date | Sat, 9 Feb 2019 20:10:53 +0100 (CET) | From | Julia Lawall <> | Subject | Re: [PATCH] coccinelle: semantic patch for missing put_device() |
| |
On Sat, 9 Feb 2019, Wen Yang wrote:
> The of_find_device_by_node() takes a reference to the underlying device > structure, we should release that reference. > Use this semantic patch, we've found some object reference leaks, > such as: > 11907e9d3533 ("ASoC: fsl-asoc-card: fix object reference leaks in fsl_asoc_card_probe") > a12085d13997 ("mtd: rawnand: atmel: fix possible object reference leak") > 11493f26856a ("mtd: rawnand: jz4780: fix possible object reference leak") > There are still dozens of reference leaks in the kernel code. > > Signed-off-by: Wen Yang <yellowriver2010@hotmail.com> > --- > scripts/coccinelle/free/put_device.cocci | 54 ++++++++++++++++++++++++++++++++ > 1 file changed, 54 insertions(+) > create mode 100644 scripts/coccinelle/free/put_device.cocci > > diff --git a/scripts/coccinelle/free/put_device.cocci b/scripts/coccinelle/free/put_device.cocci > new file mode 100644 > index 0000000..d3e3ba9 > --- /dev/null > +++ b/scripts/coccinelle/free/put_device.cocci > @@ -0,0 +1,54 @@ > +/// Find missing put_device for every of_find_device_by_node. > +/// > +// Confidence: Moderate > +// Copyright: (C) 2018-2019 Wen Yang, ZTE. GPLv2. > +// Comments: > +// Options: --no-includes --include-headers > + > +virtual report > +virtual org > + > +@search@
Just put exists after search, and then drop the when exists below.
> +local idexpression id; > +expression x,e; > +position p1,p2; > +type T; > +@@ > + > +id = of_find_device_by_node@p1(x) > +... when != e = id
This should not use the same e as in the when's below. Make a new matavariavle e1 and use that here.
> +if (id == NULL || ...) { ... return ...; } > +... when != put_device(&id->dev)
I have the impression that you should also consider platform_device_put.
> + when != of_dev_put(&id) > + when != if (id) { ... put_device(&id->dev) ... } > + when != e = (T)id > + when != e = &id->dev > + when != e = gen_pool_get(&id->dev, ...) > + when != e = platform_get_drvdata(id) > + when exists > +( > +return id; > +| > +return dev_get_drvdata(&id->dev); > +| > +return platform_get_drvdata(id)
Make a new type metavariable T1 amd use it to put a cast on the result of platform_get_drvdata. For dev_get_drvdata, I didn't actually find any examples with a cast, but it wouldn't hurt to put a cast there too
Thanks, julia
> +| > +return@p2 ...; > +) > + > +@script:python depends on report@ > +p1 << search.p1; > +p2 << search.p2; > +@@ > + > +msg = "ERROR: missing put_device; of_find_device_by_node on line %s and return without releasing on line %s" % (p1[0].line,p2[0].line) > +coccilib.report.print_report(p2[0],msg) > + > +@script:python depends on org@ > +p1 << search.p1; > +p2 << search.p2; > +@@ > + > +msg = "ERROR: missing put_device; of_find_device_by_node on line %s and return without releasing on line %s" % (p1[0].line,p2[0].line) > +cocci.print_main(msg,p1) > +cocci.print_secs("",p2) > -- > 2.7.4 > >
| |