123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- // SPDX-License-Identifier: GPL-2.0-only
- ///
- /// Check that kvmalloc'ed memory is freed by kfree functions,
- /// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree
- /// functions.
- ///
- // Confidence: High
- // Copyright: (C) 2020 Denis Efremov ISPRAS
- // Options: --no-includes --include-headers
- //
- virtual patch
- virtual report
- virtual org
- virtual context
- @alloc@
- expression E, E1;
- position kok, vok;
- @@
- (
- if (...) {
- ...
- E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|
- kmalloc_node\|kzalloc_node\|kmalloc_array\|
- kmalloc_array_node\|kcalloc_node\)(...)@kok
- ...
- } else {
- ...
- E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
- vzalloc_node\|vmalloc_exec\|vmalloc_32\|
- vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
- __vmalloc_node\)(...)@vok
- ...
- }
- |
- E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
- kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok
- ... when != E = E1
- when any
- if (E == NULL) {
- ...
- E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
- vzalloc_node\|vmalloc_exec\|vmalloc_32\|
- vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
- __vmalloc_node\)(...)@vok
- ...
- }
- )
- @free@
- expression E;
- position fok;
- @@
- E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
- kvmalloc_array\)(...)
- ...
- kvfree(E)@fok
- @vfree depends on !patch@
- expression E;
- position a != alloc.kok;
- position f != free.fok;
- @@
- * E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
- * kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
- * kcalloc_node\)(...)@a
- ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
- when != is_vmalloc_addr(E)
- when any
- * \(vfree\|vfree_atomic\|kvfree\)(E)@f
- @depends on patch exists@
- expression E;
- position a != alloc.kok;
- position f != free.fok;
- @@
- E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
- kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
- kcalloc_node\)(...)@a
- ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
- when != is_vmalloc_addr(E)
- when any
- - \(vfree\|vfree_atomic\|kvfree\)(E)@f
- + kfree(E)
- @kfree depends on !patch@
- expression E;
- position a != alloc.vok;
- position f != free.fok;
- @@
- * E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
- * vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
- * __vmalloc_node_range\|__vmalloc_node\)(...)@a
- ... when != is_vmalloc_addr(E)
- when any
- * \(kfree\|kfree_sensitive\|kvfree\)(E)@f
- @depends on patch exists@
- expression E;
- position a != alloc.vok;
- position f != free.fok;
- @@
- E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
- vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
- __vmalloc_node_range\|__vmalloc_node\)(...)@a
- ... when != is_vmalloc_addr(E)
- when any
- - \(kfree\|kvfree\)(E)@f
- + vfree(E)
- @kvfree depends on !patch@
- expression E;
- position a, f;
- @@
- * E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
- * kvmalloc_array\)(...)@a
- ... when != is_vmalloc_addr(E)
- when any
- * \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
- @depends on patch exists@
- expression E;
- @@
- E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
- kvmalloc_array\)(...)
- ... when != is_vmalloc_addr(E)
- when any
- - \(kfree\|vfree\)(E)
- + kvfree(E)
- @kvfree_switch depends on !patch@
- expression alloc.E;
- position f;
- @@
- ... when != is_vmalloc_addr(E)
- when any
- * \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
- @depends on patch exists@
- expression alloc.E;
- position f;
- @@
- ... when != is_vmalloc_addr(E)
- when any
- (
- - \(kfree\|vfree\)(E)@f
- + kvfree(E)
- |
- - kfree_sensitive(E)@f
- + kvfree_sensitive(E)
- )
- @script: python depends on report@
- a << vfree.a;
- f << vfree.f;
- @@
- msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.report.print_report(f[0], msg)
- @script: python depends on org@
- a << vfree.a;
- f << vfree.f;
- @@
- msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.org.print_todo(f[0], msg)
- @script: python depends on report@
- a << kfree.a;
- f << kfree.f;
- @@
- msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.report.print_report(f[0], msg)
- @script: python depends on org@
- a << kfree.a;
- f << kfree.f;
- @@
- msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.org.print_todo(f[0], msg)
- @script: python depends on report@
- a << kvfree.a;
- f << kvfree.f;
- @@
- msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.report.print_report(f[0], msg)
- @script: python depends on org@
- a << kvfree.a;
- f << kvfree.f;
- @@
- msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
- coccilib.org.print_todo(f[0], msg)
- @script: python depends on report@
- ka << alloc.kok;
- va << alloc.vok;
- f << kvfree_switch.f;
- @@
- msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
- coccilib.report.print_report(f[0], msg)
- @script: python depends on org@
- ka << alloc.kok;
- va << alloc.vok;
- f << kvfree_switch.f;
- @@
- msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
- coccilib.org.print_todo(f[0], msg)
|