mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Commit 453431a549 ("mm, treewide: rename kzfree() to
kfree_sensitive()") renamed kzfree() to kfree_sensitive(),
it should be applied to coccinelle.
Signed-off-by: Weizhao Ouyang <o451686892@gmail.com>
Signed-off-by: Julia Lawall <Julia.Lawall@inria.fr>
Acked-by: Denis Efremov <efremov@linux.com>
		
	
			
		
			
				
	
	
		
			256 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
// 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")
 |