18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/// 38c2ecf20Sopenharmony_ci/// Check that kvmalloc'ed memory is freed by kfree functions, 48c2ecf20Sopenharmony_ci/// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree 58c2ecf20Sopenharmony_ci/// functions. 68c2ecf20Sopenharmony_ci/// 78c2ecf20Sopenharmony_ci// Confidence: High 88c2ecf20Sopenharmony_ci// Copyright: (C) 2020 Denis Efremov ISPRAS 98c2ecf20Sopenharmony_ci// Options: --no-includes --include-headers 108c2ecf20Sopenharmony_ci// 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_civirtual patch 138c2ecf20Sopenharmony_civirtual report 148c2ecf20Sopenharmony_civirtual org 158c2ecf20Sopenharmony_civirtual context 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci@alloc@ 188c2ecf20Sopenharmony_ciexpression E, E1; 198c2ecf20Sopenharmony_ciposition kok, vok; 208c2ecf20Sopenharmony_ci@@ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci( 238c2ecf20Sopenharmony_ci if (...) { 248c2ecf20Sopenharmony_ci ... 258c2ecf20Sopenharmony_ci E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\| 268c2ecf20Sopenharmony_ci kmalloc_node\|kzalloc_node\|kmalloc_array\| 278c2ecf20Sopenharmony_ci kmalloc_array_node\|kcalloc_node\)(...)@kok 288c2ecf20Sopenharmony_ci ... 298c2ecf20Sopenharmony_ci } else { 308c2ecf20Sopenharmony_ci ... 318c2ecf20Sopenharmony_ci E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\| 328c2ecf20Sopenharmony_ci vzalloc_node\|vmalloc_exec\|vmalloc_32\| 338c2ecf20Sopenharmony_ci vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\| 348c2ecf20Sopenharmony_ci __vmalloc_node\)(...)@vok 358c2ecf20Sopenharmony_ci ... 368c2ecf20Sopenharmony_ci } 378c2ecf20Sopenharmony_ci| 388c2ecf20Sopenharmony_ci E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\| 398c2ecf20Sopenharmony_ci kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok 408c2ecf20Sopenharmony_ci ... when != E = E1 418c2ecf20Sopenharmony_ci when any 428c2ecf20Sopenharmony_ci if (E == NULL) { 438c2ecf20Sopenharmony_ci ... 448c2ecf20Sopenharmony_ci E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\| 458c2ecf20Sopenharmony_ci vzalloc_node\|vmalloc_exec\|vmalloc_32\| 468c2ecf20Sopenharmony_ci vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\| 478c2ecf20Sopenharmony_ci __vmalloc_node\)(...)@vok 488c2ecf20Sopenharmony_ci ... 498c2ecf20Sopenharmony_ci } 508c2ecf20Sopenharmony_ci) 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci@free@ 538c2ecf20Sopenharmony_ciexpression E; 548c2ecf20Sopenharmony_ciposition fok; 558c2ecf20Sopenharmony_ci@@ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| 588c2ecf20Sopenharmony_ci kvmalloc_array\)(...) 598c2ecf20Sopenharmony_ci ... 608c2ecf20Sopenharmony_ci kvfree(E)@fok 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci@vfree depends on !patch@ 638c2ecf20Sopenharmony_ciexpression E; 648c2ecf20Sopenharmony_ciposition a != alloc.kok; 658c2ecf20Sopenharmony_ciposition f != free.fok; 668c2ecf20Sopenharmony_ci@@ 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci* E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\| 698c2ecf20Sopenharmony_ci* kzalloc_node\|kmalloc_array\|kmalloc_array_node\| 708c2ecf20Sopenharmony_ci* kcalloc_node\)(...)@a 718c2ecf20Sopenharmony_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\)(...); ... } 728c2ecf20Sopenharmony_ci when != is_vmalloc_addr(E) 738c2ecf20Sopenharmony_ci when any 748c2ecf20Sopenharmony_ci* \(vfree\|vfree_atomic\|kvfree\)(E)@f 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci@depends on patch exists@ 778c2ecf20Sopenharmony_ciexpression E; 788c2ecf20Sopenharmony_ciposition a != alloc.kok; 798c2ecf20Sopenharmony_ciposition f != free.fok; 808c2ecf20Sopenharmony_ci@@ 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\| 838c2ecf20Sopenharmony_ci kzalloc_node\|kmalloc_array\|kmalloc_array_node\| 848c2ecf20Sopenharmony_ci kcalloc_node\)(...)@a 858c2ecf20Sopenharmony_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\)(...); ... } 868c2ecf20Sopenharmony_ci when != is_vmalloc_addr(E) 878c2ecf20Sopenharmony_ci when any 888c2ecf20Sopenharmony_ci- \(vfree\|vfree_atomic\|kvfree\)(E)@f 898c2ecf20Sopenharmony_ci+ kfree(E) 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci@kfree depends on !patch@ 928c2ecf20Sopenharmony_ciexpression E; 938c2ecf20Sopenharmony_ciposition a != alloc.vok; 948c2ecf20Sopenharmony_ciposition f != free.fok; 958c2ecf20Sopenharmony_ci@@ 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci* E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\| 988c2ecf20Sopenharmony_ci* vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\| 998c2ecf20Sopenharmony_ci* __vmalloc_node_range\|__vmalloc_node\)(...)@a 1008c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1018c2ecf20Sopenharmony_ci when any 1028c2ecf20Sopenharmony_ci* \(kfree\|kfree_sensitive\|kvfree\)(E)@f 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci@depends on patch exists@ 1058c2ecf20Sopenharmony_ciexpression E; 1068c2ecf20Sopenharmony_ciposition a != alloc.vok; 1078c2ecf20Sopenharmony_ciposition f != free.fok; 1088c2ecf20Sopenharmony_ci@@ 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\| 1118c2ecf20Sopenharmony_ci vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\| 1128c2ecf20Sopenharmony_ci __vmalloc_node_range\|__vmalloc_node\)(...)@a 1138c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1148c2ecf20Sopenharmony_ci when any 1158c2ecf20Sopenharmony_ci- \(kfree\|kvfree\)(E)@f 1168c2ecf20Sopenharmony_ci+ vfree(E) 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci@kvfree depends on !patch@ 1198c2ecf20Sopenharmony_ciexpression E; 1208c2ecf20Sopenharmony_ciposition a, f; 1218c2ecf20Sopenharmony_ci@@ 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci* E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| 1248c2ecf20Sopenharmony_ci* kvmalloc_array\)(...)@a 1258c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1268c2ecf20Sopenharmony_ci when any 1278c2ecf20Sopenharmony_ci* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci@depends on patch exists@ 1308c2ecf20Sopenharmony_ciexpression E; 1318c2ecf20Sopenharmony_ci@@ 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\| 1348c2ecf20Sopenharmony_ci kvmalloc_array\)(...) 1358c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1368c2ecf20Sopenharmony_ci when any 1378c2ecf20Sopenharmony_ci- \(kfree\|vfree\)(E) 1388c2ecf20Sopenharmony_ci+ kvfree(E) 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci@kvfree_switch depends on !patch@ 1418c2ecf20Sopenharmony_ciexpression alloc.E; 1428c2ecf20Sopenharmony_ciposition f; 1438c2ecf20Sopenharmony_ci@@ 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1468c2ecf20Sopenharmony_ci when any 1478c2ecf20Sopenharmony_ci* \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci@depends on patch exists@ 1508c2ecf20Sopenharmony_ciexpression alloc.E; 1518c2ecf20Sopenharmony_ciposition f; 1528c2ecf20Sopenharmony_ci@@ 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci ... when != is_vmalloc_addr(E) 1558c2ecf20Sopenharmony_ci when any 1568c2ecf20Sopenharmony_ci( 1578c2ecf20Sopenharmony_ci- \(kfree\|vfree\)(E)@f 1588c2ecf20Sopenharmony_ci+ kvfree(E) 1598c2ecf20Sopenharmony_ci| 1608c2ecf20Sopenharmony_ci- kfree_sensitive(E)@f 1618c2ecf20Sopenharmony_ci+ kvfree_sensitive(E) 1628c2ecf20Sopenharmony_ci) 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci@script: python depends on report@ 1658c2ecf20Sopenharmony_cia << vfree.a; 1668c2ecf20Sopenharmony_cif << vfree.f; 1678c2ecf20Sopenharmony_ci@@ 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cimsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line) 1708c2ecf20Sopenharmony_cicoccilib.report.print_report(f[0], msg) 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci@script: python depends on org@ 1738c2ecf20Sopenharmony_cia << vfree.a; 1748c2ecf20Sopenharmony_cif << vfree.f; 1758c2ecf20Sopenharmony_ci@@ 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cimsg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line) 1788c2ecf20Sopenharmony_cicoccilib.org.print_todo(f[0], msg) 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci@script: python depends on report@ 1818c2ecf20Sopenharmony_cia << kfree.a; 1828c2ecf20Sopenharmony_cif << kfree.f; 1838c2ecf20Sopenharmony_ci@@ 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cimsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line) 1868c2ecf20Sopenharmony_cicoccilib.report.print_report(f[0], msg) 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci@script: python depends on org@ 1898c2ecf20Sopenharmony_cia << kfree.a; 1908c2ecf20Sopenharmony_cif << kfree.f; 1918c2ecf20Sopenharmony_ci@@ 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cimsg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line) 1948c2ecf20Sopenharmony_cicoccilib.org.print_todo(f[0], msg) 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci@script: python depends on report@ 1978c2ecf20Sopenharmony_cia << kvfree.a; 1988c2ecf20Sopenharmony_cif << kvfree.f; 1998c2ecf20Sopenharmony_ci@@ 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cimsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line) 2028c2ecf20Sopenharmony_cicoccilib.report.print_report(f[0], msg) 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci@script: python depends on org@ 2058c2ecf20Sopenharmony_cia << kvfree.a; 2068c2ecf20Sopenharmony_cif << kvfree.f; 2078c2ecf20Sopenharmony_ci@@ 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cimsg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line) 2108c2ecf20Sopenharmony_cicoccilib.org.print_todo(f[0], msg) 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci@script: python depends on report@ 2138c2ecf20Sopenharmony_cika << alloc.kok; 2148c2ecf20Sopenharmony_civa << alloc.vok; 2158c2ecf20Sopenharmony_cif << kvfree_switch.f; 2168c2ecf20Sopenharmony_ci@@ 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cimsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line) 2198c2ecf20Sopenharmony_cicoccilib.report.print_report(f[0], msg) 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci@script: python depends on org@ 2228c2ecf20Sopenharmony_cika << alloc.kok; 2238c2ecf20Sopenharmony_civa << alloc.vok; 2248c2ecf20Sopenharmony_cif << kvfree_switch.f; 2258c2ecf20Sopenharmony_ci@@ 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cimsg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line) 2288c2ecf20Sopenharmony_cicoccilib.org.print_todo(f[0], msg) 229