xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/api/kfree_mismatch.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun///
3*4882a593Smuzhiyun/// Check that kvmalloc'ed memory is freed by kfree functions,
4*4882a593Smuzhiyun/// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree
5*4882a593Smuzhiyun/// functions.
6*4882a593Smuzhiyun///
7*4882a593Smuzhiyun// Confidence: High
8*4882a593Smuzhiyun// Copyright: (C) 2020 Denis Efremov ISPRAS
9*4882a593Smuzhiyun// Options: --no-includes --include-headers
10*4882a593Smuzhiyun//
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunvirtual patch
13*4882a593Smuzhiyunvirtual report
14*4882a593Smuzhiyunvirtual org
15*4882a593Smuzhiyunvirtual context
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun@alloc@
18*4882a593Smuzhiyunexpression E, E1;
19*4882a593Smuzhiyunposition kok, vok;
20*4882a593Smuzhiyun@@
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun(
23*4882a593Smuzhiyun  if (...) {
24*4882a593Smuzhiyun    ...
25*4882a593Smuzhiyun    E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|
26*4882a593Smuzhiyun          kmalloc_node\|kzalloc_node\|kmalloc_array\|
27*4882a593Smuzhiyun          kmalloc_array_node\|kcalloc_node\)(...)@kok
28*4882a593Smuzhiyun    ...
29*4882a593Smuzhiyun  } else {
30*4882a593Smuzhiyun    ...
31*4882a593Smuzhiyun    E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
32*4882a593Smuzhiyun          vzalloc_node\|vmalloc_exec\|vmalloc_32\|
33*4882a593Smuzhiyun          vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
34*4882a593Smuzhiyun          __vmalloc_node\)(...)@vok
35*4882a593Smuzhiyun    ...
36*4882a593Smuzhiyun  }
37*4882a593Smuzhiyun|
38*4882a593Smuzhiyun  E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
39*4882a593Smuzhiyun        kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok
40*4882a593Smuzhiyun  ... when != E = E1
41*4882a593Smuzhiyun      when any
42*4882a593Smuzhiyun  if (E == NULL) {
43*4882a593Smuzhiyun    ...
44*4882a593Smuzhiyun    E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
45*4882a593Smuzhiyun          vzalloc_node\|vmalloc_exec\|vmalloc_32\|
46*4882a593Smuzhiyun          vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
47*4882a593Smuzhiyun          __vmalloc_node\)(...)@vok
48*4882a593Smuzhiyun    ...
49*4882a593Smuzhiyun  }
50*4882a593Smuzhiyun)
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun@free@
53*4882a593Smuzhiyunexpression E;
54*4882a593Smuzhiyunposition fok;
55*4882a593Smuzhiyun@@
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun  E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
58*4882a593Smuzhiyun        kvmalloc_array\)(...)
59*4882a593Smuzhiyun  ...
60*4882a593Smuzhiyun  kvfree(E)@fok
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun@vfree depends on !patch@
63*4882a593Smuzhiyunexpression E;
64*4882a593Smuzhiyunposition a != alloc.kok;
65*4882a593Smuzhiyunposition f != free.fok;
66*4882a593Smuzhiyun@@
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun* E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
69*4882a593Smuzhiyun*       kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
70*4882a593Smuzhiyun*       kcalloc_node\)(...)@a
71*4882a593Smuzhiyun  ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
72*4882a593Smuzhiyun      when != is_vmalloc_addr(E)
73*4882a593Smuzhiyun      when any
74*4882a593Smuzhiyun* \(vfree\|vfree_atomic\|kvfree\)(E)@f
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun@depends on patch exists@
77*4882a593Smuzhiyunexpression E;
78*4882a593Smuzhiyunposition a != alloc.kok;
79*4882a593Smuzhiyunposition f != free.fok;
80*4882a593Smuzhiyun@@
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun  E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
83*4882a593Smuzhiyun        kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
84*4882a593Smuzhiyun        kcalloc_node\)(...)@a
85*4882a593Smuzhiyun  ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
86*4882a593Smuzhiyun      when != is_vmalloc_addr(E)
87*4882a593Smuzhiyun      when any
88*4882a593Smuzhiyun- \(vfree\|vfree_atomic\|kvfree\)(E)@f
89*4882a593Smuzhiyun+ kfree(E)
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun@kfree depends on !patch@
92*4882a593Smuzhiyunexpression E;
93*4882a593Smuzhiyunposition a != alloc.vok;
94*4882a593Smuzhiyunposition f != free.fok;
95*4882a593Smuzhiyun@@
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun* E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
98*4882a593Smuzhiyun*       vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
99*4882a593Smuzhiyun*       __vmalloc_node_range\|__vmalloc_node\)(...)@a
100*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
101*4882a593Smuzhiyun      when any
102*4882a593Smuzhiyun* \(kfree\|kfree_sensitive\|kvfree\)(E)@f
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun@depends on patch exists@
105*4882a593Smuzhiyunexpression E;
106*4882a593Smuzhiyunposition a != alloc.vok;
107*4882a593Smuzhiyunposition f != free.fok;
108*4882a593Smuzhiyun@@
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun  E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
111*4882a593Smuzhiyun        vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
112*4882a593Smuzhiyun        __vmalloc_node_range\|__vmalloc_node\)(...)@a
113*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
114*4882a593Smuzhiyun      when any
115*4882a593Smuzhiyun- \(kfree\|kvfree\)(E)@f
116*4882a593Smuzhiyun+ vfree(E)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun@kvfree depends on !patch@
119*4882a593Smuzhiyunexpression E;
120*4882a593Smuzhiyunposition a, f;
121*4882a593Smuzhiyun@@
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun* E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
124*4882a593Smuzhiyun*       kvmalloc_array\)(...)@a
125*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
126*4882a593Smuzhiyun      when any
127*4882a593Smuzhiyun* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun@depends on patch exists@
130*4882a593Smuzhiyunexpression E;
131*4882a593Smuzhiyun@@
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun  E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
134*4882a593Smuzhiyun        kvmalloc_array\)(...)
135*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
136*4882a593Smuzhiyun      when any
137*4882a593Smuzhiyun- \(kfree\|vfree\)(E)
138*4882a593Smuzhiyun+ kvfree(E)
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun@kvfree_switch depends on !patch@
141*4882a593Smuzhiyunexpression alloc.E;
142*4882a593Smuzhiyunposition f;
143*4882a593Smuzhiyun@@
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
146*4882a593Smuzhiyun      when any
147*4882a593Smuzhiyun* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun@depends on patch exists@
150*4882a593Smuzhiyunexpression alloc.E;
151*4882a593Smuzhiyunposition f;
152*4882a593Smuzhiyun@@
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun  ... when != is_vmalloc_addr(E)
155*4882a593Smuzhiyun      when any
156*4882a593Smuzhiyun(
157*4882a593Smuzhiyun- \(kfree\|vfree\)(E)@f
158*4882a593Smuzhiyun+ kvfree(E)
159*4882a593Smuzhiyun|
160*4882a593Smuzhiyun- kfree_sensitive(E)@f
161*4882a593Smuzhiyun+ kvfree_sensitive(E)
162*4882a593Smuzhiyun)
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun@script: python depends on report@
165*4882a593Smuzhiyuna << vfree.a;
166*4882a593Smuzhiyunf << vfree.f;
167*4882a593Smuzhiyun@@
168*4882a593Smuzhiyun
169*4882a593Smuzhiyunmsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
170*4882a593Smuzhiyuncoccilib.report.print_report(f[0], msg)
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun@script: python depends on org@
173*4882a593Smuzhiyuna << vfree.a;
174*4882a593Smuzhiyunf << vfree.f;
175*4882a593Smuzhiyun@@
176*4882a593Smuzhiyun
177*4882a593Smuzhiyunmsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
178*4882a593Smuzhiyuncoccilib.org.print_todo(f[0], msg)
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun@script: python depends on report@
181*4882a593Smuzhiyuna << kfree.a;
182*4882a593Smuzhiyunf << kfree.f;
183*4882a593Smuzhiyun@@
184*4882a593Smuzhiyun
185*4882a593Smuzhiyunmsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
186*4882a593Smuzhiyuncoccilib.report.print_report(f[0], msg)
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun@script: python depends on org@
189*4882a593Smuzhiyuna << kfree.a;
190*4882a593Smuzhiyunf << kfree.f;
191*4882a593Smuzhiyun@@
192*4882a593Smuzhiyun
193*4882a593Smuzhiyunmsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
194*4882a593Smuzhiyuncoccilib.org.print_todo(f[0], msg)
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun@script: python depends on report@
197*4882a593Smuzhiyuna << kvfree.a;
198*4882a593Smuzhiyunf << kvfree.f;
199*4882a593Smuzhiyun@@
200*4882a593Smuzhiyun
201*4882a593Smuzhiyunmsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
202*4882a593Smuzhiyuncoccilib.report.print_report(f[0], msg)
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun@script: python depends on org@
205*4882a593Smuzhiyuna << kvfree.a;
206*4882a593Smuzhiyunf << kvfree.f;
207*4882a593Smuzhiyun@@
208*4882a593Smuzhiyun
209*4882a593Smuzhiyunmsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
210*4882a593Smuzhiyuncoccilib.org.print_todo(f[0], msg)
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun@script: python depends on report@
213*4882a593Smuzhiyunka << alloc.kok;
214*4882a593Smuzhiyunva << alloc.vok;
215*4882a593Smuzhiyunf << kvfree_switch.f;
216*4882a593Smuzhiyun@@
217*4882a593Smuzhiyun
218*4882a593Smuzhiyunmsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
219*4882a593Smuzhiyuncoccilib.report.print_report(f[0], msg)
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun@script: python depends on org@
222*4882a593Smuzhiyunka << alloc.kok;
223*4882a593Smuzhiyunva << alloc.vok;
224*4882a593Smuzhiyunf << kvfree_switch.f;
225*4882a593Smuzhiyun@@
226*4882a593Smuzhiyun
227*4882a593Smuzhiyunmsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
228*4882a593Smuzhiyuncoccilib.org.print_todo(f[0], msg)
229