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