162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci///
362306a36Sopenharmony_ci/// Check that kvmalloc'ed memory is freed by kfree functions,
462306a36Sopenharmony_ci/// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree
562306a36Sopenharmony_ci/// functions.
662306a36Sopenharmony_ci///
762306a36Sopenharmony_ci// Confidence: High
862306a36Sopenharmony_ci// Copyright: (C) 2020 Denis Efremov ISPRAS
962306a36Sopenharmony_ci// Options: --no-includes --include-headers
1062306a36Sopenharmony_ci//
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_civirtual patch
1362306a36Sopenharmony_civirtual report
1462306a36Sopenharmony_civirtual org
1562306a36Sopenharmony_civirtual context
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci@alloc@
1862306a36Sopenharmony_ciexpression E, E1;
1962306a36Sopenharmony_ciposition kok, vok;
2062306a36Sopenharmony_ci@@
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci(
2362306a36Sopenharmony_ci  if (...) {
2462306a36Sopenharmony_ci    ...
2562306a36Sopenharmony_ci    E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|
2662306a36Sopenharmony_ci          kmalloc_node\|kzalloc_node\|kmalloc_array\|
2762306a36Sopenharmony_ci          kmalloc_array_node\|kcalloc_node\)(...)@kok
2862306a36Sopenharmony_ci    ...
2962306a36Sopenharmony_ci  } else {
3062306a36Sopenharmony_ci    ...
3162306a36Sopenharmony_ci    E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
3262306a36Sopenharmony_ci          vzalloc_node\|vmalloc_exec\|vmalloc_32\|
3362306a36Sopenharmony_ci          vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
3462306a36Sopenharmony_ci          __vmalloc_node\)(...)@vok
3562306a36Sopenharmony_ci    ...
3662306a36Sopenharmony_ci  }
3762306a36Sopenharmony_ci|
3862306a36Sopenharmony_ci  E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
3962306a36Sopenharmony_ci        kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok
4062306a36Sopenharmony_ci  ... when != E = E1
4162306a36Sopenharmony_ci      when any
4262306a36Sopenharmony_ci  if (E == NULL) {
4362306a36Sopenharmony_ci    ...
4462306a36Sopenharmony_ci    E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
4562306a36Sopenharmony_ci          vzalloc_node\|vmalloc_exec\|vmalloc_32\|
4662306a36Sopenharmony_ci          vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
4762306a36Sopenharmony_ci          __vmalloc_node\)(...)@vok
4862306a36Sopenharmony_ci    ...
4962306a36Sopenharmony_ci  }
5062306a36Sopenharmony_ci)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci@free@
5362306a36Sopenharmony_ciexpression E;
5462306a36Sopenharmony_ciposition fok;
5562306a36Sopenharmony_ci@@
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci  E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
5862306a36Sopenharmony_ci        kvmalloc_array\)(...)
5962306a36Sopenharmony_ci  ...
6062306a36Sopenharmony_ci  kvfree(E)@fok
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci@vfree depends on !patch@
6362306a36Sopenharmony_ciexpression E;
6462306a36Sopenharmony_ciposition a != alloc.kok;
6562306a36Sopenharmony_ciposition f != free.fok;
6662306a36Sopenharmony_ci@@
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci* E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
6962306a36Sopenharmony_ci*       kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
7062306a36Sopenharmony_ci*       kcalloc_node\)(...)@a
7162306a36Sopenharmony_ci  ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
7262306a36Sopenharmony_ci      when != is_vmalloc_addr(E)
7362306a36Sopenharmony_ci      when any
7462306a36Sopenharmony_ci* \(vfree\|vfree_atomic\|kvfree\)(E)@f
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci@depends on patch exists@
7762306a36Sopenharmony_ciexpression E;
7862306a36Sopenharmony_ciposition a != alloc.kok;
7962306a36Sopenharmony_ciposition f != free.fok;
8062306a36Sopenharmony_ci@@
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci  E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
8362306a36Sopenharmony_ci        kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
8462306a36Sopenharmony_ci        kcalloc_node\)(...)@a
8562306a36Sopenharmony_ci  ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
8662306a36Sopenharmony_ci      when != is_vmalloc_addr(E)
8762306a36Sopenharmony_ci      when any
8862306a36Sopenharmony_ci- \(vfree\|vfree_atomic\|kvfree\)(E)@f
8962306a36Sopenharmony_ci+ kfree(E)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci@kfree depends on !patch@
9262306a36Sopenharmony_ciexpression E;
9362306a36Sopenharmony_ciposition a != alloc.vok;
9462306a36Sopenharmony_ciposition f != free.fok;
9562306a36Sopenharmony_ci@@
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci* E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
9862306a36Sopenharmony_ci*       vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
9962306a36Sopenharmony_ci*       __vmalloc_node_range\|__vmalloc_node\)(...)@a
10062306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
10162306a36Sopenharmony_ci      when any
10262306a36Sopenharmony_ci* \(kfree\|kfree_sensitive\|kvfree\)(E)@f
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci@depends on patch exists@
10562306a36Sopenharmony_ciexpression E;
10662306a36Sopenharmony_ciposition a != alloc.vok;
10762306a36Sopenharmony_ciposition f != free.fok;
10862306a36Sopenharmony_ci@@
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci  E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
11162306a36Sopenharmony_ci        vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
11262306a36Sopenharmony_ci        __vmalloc_node_range\|__vmalloc_node\)(...)@a
11362306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
11462306a36Sopenharmony_ci      when any
11562306a36Sopenharmony_ci- \(kfree\|kvfree\)(E)@f
11662306a36Sopenharmony_ci+ vfree(E)
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci@kvfree depends on !patch@
11962306a36Sopenharmony_ciexpression E;
12062306a36Sopenharmony_ciposition a, f;
12162306a36Sopenharmony_ci@@
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci* E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
12462306a36Sopenharmony_ci*       kvmalloc_array\)(...)@a
12562306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
12662306a36Sopenharmony_ci      when any
12762306a36Sopenharmony_ci* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci@depends on patch exists@
13062306a36Sopenharmony_ciexpression E;
13162306a36Sopenharmony_ci@@
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci  E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
13462306a36Sopenharmony_ci        kvmalloc_array\)(...)
13562306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
13662306a36Sopenharmony_ci      when any
13762306a36Sopenharmony_ci- \(kfree\|vfree\)(E)
13862306a36Sopenharmony_ci+ kvfree(E)
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci@kvfree_switch depends on !patch@
14162306a36Sopenharmony_ciexpression alloc.E;
14262306a36Sopenharmony_ciposition f;
14362306a36Sopenharmony_ci@@
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
14662306a36Sopenharmony_ci      when any
14762306a36Sopenharmony_ci* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci@depends on patch exists@
15062306a36Sopenharmony_ciexpression alloc.E;
15162306a36Sopenharmony_ciposition f;
15262306a36Sopenharmony_ci@@
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci  ... when != is_vmalloc_addr(E)
15562306a36Sopenharmony_ci      when any
15662306a36Sopenharmony_ci(
15762306a36Sopenharmony_ci- \(kfree\|vfree\)(E)@f
15862306a36Sopenharmony_ci+ kvfree(E)
15962306a36Sopenharmony_ci|
16062306a36Sopenharmony_ci- kfree_sensitive(E)@f
16162306a36Sopenharmony_ci+ kvfree_sensitive(E)
16262306a36Sopenharmony_ci)
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci@script: python depends on report@
16562306a36Sopenharmony_cia << vfree.a;
16662306a36Sopenharmony_cif << vfree.f;
16762306a36Sopenharmony_ci@@
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cimsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
17062306a36Sopenharmony_cicoccilib.report.print_report(f[0], msg)
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci@script: python depends on org@
17362306a36Sopenharmony_cia << vfree.a;
17462306a36Sopenharmony_cif << vfree.f;
17562306a36Sopenharmony_ci@@
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cimsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
17862306a36Sopenharmony_cicoccilib.org.print_todo(f[0], msg)
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci@script: python depends on report@
18162306a36Sopenharmony_cia << kfree.a;
18262306a36Sopenharmony_cif << kfree.f;
18362306a36Sopenharmony_ci@@
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cimsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
18662306a36Sopenharmony_cicoccilib.report.print_report(f[0], msg)
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci@script: python depends on org@
18962306a36Sopenharmony_cia << kfree.a;
19062306a36Sopenharmony_cif << kfree.f;
19162306a36Sopenharmony_ci@@
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cimsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
19462306a36Sopenharmony_cicoccilib.org.print_todo(f[0], msg)
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci@script: python depends on report@
19762306a36Sopenharmony_cia << kvfree.a;
19862306a36Sopenharmony_cif << kvfree.f;
19962306a36Sopenharmony_ci@@
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cimsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
20262306a36Sopenharmony_cicoccilib.report.print_report(f[0], msg)
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci@script: python depends on org@
20562306a36Sopenharmony_cia << kvfree.a;
20662306a36Sopenharmony_cif << kvfree.f;
20762306a36Sopenharmony_ci@@
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cimsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
21062306a36Sopenharmony_cicoccilib.org.print_todo(f[0], msg)
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci@script: python depends on report@
21362306a36Sopenharmony_cika << alloc.kok;
21462306a36Sopenharmony_civa << alloc.vok;
21562306a36Sopenharmony_cif << kvfree_switch.f;
21662306a36Sopenharmony_ci@@
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cimsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
21962306a36Sopenharmony_cicoccilib.report.print_report(f[0], msg)
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci@script: python depends on org@
22262306a36Sopenharmony_cika << alloc.kok;
22362306a36Sopenharmony_civa << alloc.vok;
22462306a36Sopenharmony_cif << kvfree_switch.f;
22562306a36Sopenharmony_ci@@
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cimsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
22862306a36Sopenharmony_cicoccilib.org.print_todo(f[0], msg)
229