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