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