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