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