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