fefd0331a2ded935d79d11af707433fcc401611e
[sfrench/cifs-2.6.git] / scripts / coccinelle / free / devm_free.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 /// Find uses of standard freeing functons on values allocated using devm_
3 /// functions.  Values allocated using the devm_functions are freed when
4 /// the device is detached, and thus the use of the standard freeing
5 /// function would cause a double free.
6 /// See Documentation/driver-model/devres.rst for more information.
7 ///
8 /// A difficulty of detecting this problem is that the standard freeing
9 /// function might be called from a different function than the one
10 /// containing the allocation function.  It is thus necessary to make the
11 /// connection between the allocation function and the freeing function.
12 /// Here this is done using the specific argument text, which is prone to
13 /// false positives.  There is no rule for the request_region and
14 /// request_mem_region variants because this heuristic seems to be a bit
15 /// less reliable in these cases.
16 ///
17 // Confidence: Moderate
18 // Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.
19 // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.
20 // URL: http://coccinelle.lip6.fr/
21 // Comments:
22 // Options: --no-includes --include-headers
23
24 virtual org
25 virtual report
26 virtual context
27
28 @r depends on context || org || report@
29 expression x;
30 @@
31
32 (
33  x = devm_kmalloc(...)
34 |
35  x = devm_kvasprintf(...)
36 |
37  x = devm_kasprintf(...)
38 |
39  x = devm_kzalloc(...)
40 |
41  x = devm_kmalloc_array(...)
42 |
43  x = devm_kcalloc(...)
44 |
45  x = devm_kstrdup(...)
46 |
47  x = devm_kmemdup(...)
48 |
49  x = devm_get_free_pages(...)
50 |
51  x = devm_request_irq(...)
52 |
53  x = devm_ioremap(...)
54 |
55  x = devm_ioremap_nocache(...)
56 |
57  x = devm_ioport_map(...)
58 )
59
60 @safe depends on context || org || report exists@
61 expression x;
62 position p;
63 @@
64
65 (
66  x = kmalloc(...)
67 |
68  x = kvasprintf(...)
69 |
70  x = kasprintf(...)
71 |
72  x = kzalloc(...)
73 |
74  x = kmalloc_array(...)
75 |
76  x = kcalloc(...)
77 |
78  x = kstrdup(...)
79 |
80  x = kmemdup(...)
81 |
82  x = get_free_pages(...)
83 |
84  x = request_irq(...)
85 |
86  x = ioremap(...)
87 |
88  x = ioremap_nocache(...)
89 |
90  x = ioport_map(...)
91 )
92 ...
93 (
94  kfree@p(x)
95 |
96  kzfree@p(x)
97 |
98  __krealloc@p(x, ...)
99 |
100  krealloc@p(x, ...)
101 |
102  free_pages@p(x, ...)
103 |
104  free_page@p(x)
105 |
106  free_irq@p(x)
107 |
108  iounmap@p(x)
109 |
110  ioport_unmap@p(x)
111 )
112
113 @pb@
114 expression r.x;
115 position p != safe.p;
116 @@
117
118 (
119 * kfree@p(x)
120 |
121 * kzfree@p(x)
122 |
123 * __krealloc@p(x, ...)
124 |
125 * krealloc@p(x, ...)
126 |
127 * free_pages@p(x, ...)
128 |
129 * free_page@p(x)
130 |
131 * free_irq@p(x)
132 |
133 * iounmap@p(x)
134 |
135 * ioport_unmap@p(x)
136 )
137
138 @script:python depends on org@
139 p << pb.p;
140 @@
141
142 msg="WARNING: invalid free of devm_ allocated data"
143 coccilib.org.print_todo(p[0], msg)
144
145 @script:python depends on report@
146 p << pb.p;
147 @@
148
149 msg="WARNING: invalid free of devm_ allocated data"
150 coccilib.report.print_report(p[0], msg)
151