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 <yellowriver2...@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 > >