Skip to content

Commit da9cfb8

Browse files
tasksetmasahir0y
authored andcommitted
coccinelle: semantic code search for missing put_device()
The of_find_device_by_node() takes a reference to the underlying device structure, we should release that reference. The implementation of this semantic code search is: In a function, for a local variable returned by calling of_find_device_by_node(), a, if it is released by a function such as put_device()/of_dev_put()/platform_device_put() after the last use, it is considered that there is no reference leak; b, if it is passed back to the caller via dev_get_drvdata()/platform_get_drvdata()/get_device(), etc., the reference will be released in other functions, and the current function also considers that there is no reference leak; c, for the rest of the situation, the current function should release the reference by calling put_device, this code search will report the corresponding error message. By using this semantic code search, we have found some object reference leaks, such as: commit 11907e9 ("ASoC: fsl-asoc-card: fix object reference leaks in fsl_asoc_card_probe") commit a12085d ("mtd: rawnand: atmel: fix possible object reference leak") commit 11493f2 ("mtd: rawnand: jz4780: fix possible object reference leak") There are still dozens of reference leaks in the current kernel code. Further, for the case of b, the object returned to other functions may also have a reference leak, we will continue to develop other cocci scripts to further check the reference leak. Signed-off-by: Wen Yang <wen.yang99@zte.com.cn> Reviewed-by: Julia Lawall <Julia.Lawall@lip6.fr> Reviewed-by: Markus Elfring <Markus.Elfring@web.de> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
1 parent 6fb7ef5 commit da9cfb8

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/// Find missing put_device for every of_find_device_by_node.
3+
///
4+
// Confidence: Moderate
5+
// Copyright: (C) 2018-2019 Wen Yang, ZTE.
6+
// Comments:
7+
// Options: --no-includes --include-headers
8+
9+
virtual report
10+
virtual org
11+
12+
@search exists@
13+
local idexpression id;
14+
expression x,e,e1;
15+
position p1,p2;
16+
type T,T1,T2,T3;
17+
@@
18+
19+
id = of_find_device_by_node@p1(x)
20+
... when != e = id
21+
if (id == NULL || ...) { ... return ...; }
22+
... when != put_device(&id->dev)
23+
when != platform_device_put(id)
24+
when != of_dev_put(id)
25+
when != if (id) { ... put_device(&id->dev) ... }
26+
when != e1 = (T)id
27+
when != e1 = &id->dev
28+
when != e1 = get_device(&id->dev)
29+
when != e1 = (T1)platform_get_drvdata(id)
30+
(
31+
return
32+
( id
33+
| (T2)dev_get_drvdata(&id->dev)
34+
| (T3)platform_get_drvdata(id)
35+
);
36+
| return@p2 ...;
37+
)
38+
39+
@script:python depends on report@
40+
p1 << search.p1;
41+
p2 << search.p2;
42+
@@
43+
44+
coccilib.report.print_report(p2[0], "ERROR: missing put_device; "
45+
+ "call of_find_device_by_node on line "
46+
+ p1[0].line
47+
+ ", but without a corresponding object release "
48+
+ "within this function.")
49+
50+
@script:python depends on org@
51+
p1 << search.p1;
52+
p2 << search.p2;
53+
@@
54+
55+
cocci.print_main("of_find_device_by_node", p1)
56+
cocci.print_secs("needed put_device", p2)

0 commit comments

Comments
 (0)