123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- // SPDX-License-Identifier: GPL-2.0-only
- ///
- /// Find if/else condition with kmalloc/vmalloc calls.
- /// Suggest to use kvmalloc instead. Same for kvfree.
- ///
- // Confidence: High
- // Copyright: (C) 2020 Denis Efremov ISPRAS
- // Options: --no-includes --include-headers
- //
- virtual patch
- virtual report
- virtual org
- virtual context
- @initialize:python@
- @@
- filter = frozenset(['kvfree'])
- def relevant(p):
- return not (filter & {el.current_element for el in p})
- @kvmalloc depends on !patch@
- expression E, E1, size;
- identifier flags;
- binary operator cmp = {<=, <, ==, >, >=};
- identifier x;
- type T;
- position p;
- @@
- (
- * if (size cmp E1 || ...)@p {
- ...
- * E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
- * kmalloc_array\|kmalloc_array_node\|kcalloc_node\)
- * (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...)
- ...
- } else {
- ...
- * E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)
- ...
- }
- |
- * E = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
- * kmalloc_array\|kmalloc_array_node\|kcalloc_node\)
- * (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...)
- ... when != E = E1
- when != size = E1
- when any
- * if (E == NULL)@p {
- ...
- * E = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)
- ...
- }
- |
- * T x = \(kmalloc\|kzalloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
- * kmalloc_array\|kmalloc_array_node\|kcalloc_node\)
- * (..., size, \(flags\|GFP_KERNEL\|\(GFP_KERNEL\|flags\)|__GFP_NOWARN\), ...);
- ... when != x = E1
- when != size = E1
- when any
- * if (x == NULL)@p {
- ...
- * x = \(vmalloc\|vzalloc\|vmalloc_node\|vzalloc_node\)(..., size, ...)
- ...
- }
- )
- @kvfree depends on !patch@
- expression E;
- position p : script:python() { relevant(p) };
- @@
- * if (is_vmalloc_addr(E))@p {
- ...
- * vfree(E)
- ...
- } else {
- ... when != krealloc(E, ...)
- when any
- * \(kfree\|kfree_sensitive\)(E)
- ...
- }
- @depends on patch@
- expression E, E1, size, node;
- binary operator cmp = {<=, <, ==, >, >=};
- identifier flags, x;
- type T;
- @@
- (
- - if (size cmp E1)
- - E = kmalloc(size, flags);
- - else
- - E = vmalloc(size);
- + E = kvmalloc(size, flags);
- |
- - if (size cmp E1)
- - E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - else
- - E = vmalloc(size);
- + E = kvmalloc(size, GFP_KERNEL);
- |
- - E = kmalloc(size, flags | __GFP_NOWARN);
- - if (E == NULL)
- - E = vmalloc(size);
- + E = kvmalloc(size, flags);
- |
- - E = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - if (E == NULL)
- - E = vmalloc(size);
- + E = kvmalloc(size, GFP_KERNEL);
- |
- - T x = kmalloc(size, flags | __GFP_NOWARN);
- - if (x == NULL)
- - x = vmalloc(size);
- + T x = kvmalloc(size, flags);
- |
- - T x = kmalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - if (x == NULL)
- - x = vmalloc(size);
- + T x = kvmalloc(size, GFP_KERNEL);
- |
- - if (size cmp E1)
- - E = kzalloc(size, flags);
- - else
- - E = vzalloc(size);
- + E = kvzalloc(size, flags);
- |
- - if (size cmp E1)
- - E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - else
- - E = vzalloc(size);
- + E = kvzalloc(size, GFP_KERNEL);
- |
- - E = kzalloc(size, flags | __GFP_NOWARN);
- - if (E == NULL)
- - E = vzalloc(size);
- + E = kvzalloc(size, flags);
- |
- - E = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - if (E == NULL)
- - E = vzalloc(size);
- + E = kvzalloc(size, GFP_KERNEL);
- |
- - T x = kzalloc(size, flags | __GFP_NOWARN);
- - if (x == NULL)
- - x = vzalloc(size);
- + T x = kvzalloc(size, flags);
- |
- - T x = kzalloc(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\));
- - if (x == NULL)
- - x = vzalloc(size);
- + T x = kvzalloc(size, GFP_KERNEL);
- |
- - if (size cmp E1)
- - E = kmalloc_node(size, flags, node);
- - else
- - E = vmalloc_node(size, node);
- + E = kvmalloc_node(size, flags, node);
- |
- - if (size cmp E1)
- - E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - else
- - E = vmalloc_node(size, node);
- + E = kvmalloc_node(size, GFP_KERNEL, node);
- |
- - E = kmalloc_node(size, flags | __GFP_NOWARN, node);
- - if (E == NULL)
- - E = vmalloc_node(size, node);
- + E = kvmalloc_node(size, flags, node);
- |
- - E = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - if (E == NULL)
- - E = vmalloc_node(size, node);
- + E = kvmalloc_node(size, GFP_KERNEL, node);
- |
- - T x = kmalloc_node(size, flags | __GFP_NOWARN, node);
- - if (x == NULL)
- - x = vmalloc_node(size, node);
- + T x = kvmalloc_node(size, flags, node);
- |
- - T x = kmalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - if (x == NULL)
- - x = vmalloc_node(size, node);
- + T x = kvmalloc_node(size, GFP_KERNEL, node);
- |
- - if (size cmp E1)
- - E = kvzalloc_node(size, flags, node);
- - else
- - E = vzalloc_node(size, node);
- + E = kvzalloc_node(size, flags, node);
- |
- - if (size cmp E1)
- - E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - else
- - E = vzalloc_node(size, node);
- + E = kvzalloc_node(size, GFP_KERNEL, node);
- |
- - E = kvzalloc_node(size, flags | __GFP_NOWARN, node);
- - if (E == NULL)
- - E = vzalloc_node(size, node);
- + E = kvzalloc_node(size, flags, node);
- |
- - E = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - if (E == NULL)
- - E = vzalloc_node(size, node);
- + E = kvzalloc_node(size, GFP_KERNEL, node);
- |
- - T x = kvzalloc_node(size, flags | __GFP_NOWARN, node);
- - if (x == NULL)
- - x = vzalloc_node(size, node);
- + T x = kvzalloc_node(size, flags, node);
- |
- - T x = kvzalloc_node(size, \(GFP_KERNEL\|GFP_KERNEL|__GFP_NOWARN\), node);
- - if (x == NULL)
- - x = vzalloc_node(size, node);
- + T x = kvzalloc_node(size, GFP_KERNEL, node);
- )
- @depends on patch@
- expression E;
- position p : script:python() { relevant(p) };
- @@
- - if (is_vmalloc_addr(E))@p
- - vfree(E);
- - else
- - kfree(E);
- + kvfree(E);
- @script: python depends on report@
- p << kvmalloc.p;
- @@
- coccilib.report.print_report(p[0], "WARNING opportunity for kvmalloc")
- @script: python depends on org@
- p << kvmalloc.p;
- @@
- coccilib.org.print_todo(p[0], "WARNING opportunity for kvmalloc")
- @script: python depends on report@
- p << kvfree.p;
- @@
- coccilib.report.print_report(p[0], "WARNING opportunity for kvfree")
- @script: python depends on org@
- p << kvfree.p;
- @@
- coccilib.org.print_todo(p[0], "WARNING opportunity for kvfree")
|