Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1// SPDX-License-Identifier: GPL-2.0-only
  2///
  3/// Use kzfree, kvfree_sensitive rather than memset or
  4/// memzero_explicit followed by kfree
  5///
  6// Confidence: High
  7// Copyright: (C) 2020 Denis Efremov ISPRAS
  8// Options: --no-includes --include-headers
  9//
 10// Keywords: kzfree, kvfree_sensitive
 11//
 12
 13virtual context
 14virtual patch
 15virtual org
 16virtual report
 17
 18@initialize:python@
 19@@
 20# kmalloc_oob_in_memset uses memset to explicitly trigger out-of-bounds access
 21filter = frozenset(['kmalloc_oob_in_memset', 'kzfree', 'kvfree_sensitive'])
 22
 23def relevant(p):
 24    return not (filter & {el.current_element for el in p})
 25
 26@cond@
 27position ok;
 28@@
 29
 30if (...)
 31  \(memset@ok\|memzero_explicit@ok\)(...);
 32
 33@r depends on !patch forall@
 34expression E;
 35position p : script:python() { relevant(p) };
 36position m != cond.ok;
 37type T;
 38@@
 39
 40(
 41* memset@m((T)E, 0, ...);
 42|
 43* memzero_explicit@m((T)E, ...);
 44)
 45  ... when != E
 46      when strict
 47* \(kfree\|vfree\|kvfree\)(E)@p;
 48
 49@rp_memzero depends on patch@
 50expression E, size;
 51position p : script:python() { relevant(p) };
 52position m != cond.ok;
 53type T;
 54@@
 55
 56- memzero_explicit@m((T)E, size);
 57  ... when != E
 58      when strict
 59// TODO: uncomment when kfree_sensitive will be merged.
 60// Only this case is commented out because developers
 61// may not like patches like this since kzfree uses memset
 62// internally (not memzero_explicit).
 63//(
 64//- kfree(E)@p;
 65//+ kfree_sensitive(E);
 66//|
 67- \(vfree\|kvfree\)(E)@p;
 68+ kvfree_sensitive(E, size);
 69//)
 70
 71@rp_memset depends on patch@
 72expression E, size;
 73position p : script:python() { relevant(p) };
 74position m != cond.ok;
 75type T;
 76@@
 77
 78- memset@m((T)E, 0, size);
 79  ... when != E
 80      when strict
 81(
 82- kfree(E)@p;
 83+ kzfree(E);
 84|
 85- \(vfree\|kvfree\)(E)@p;
 86+ kvfree_sensitive(E, size);
 87)
 88
 89@script:python depends on report@
 90p << r.p;
 91@@
 92
 93coccilib.report.print_report(p[0],
 94  "WARNING: opportunity for kzfree/kvfree_sensitive")
 95
 96@script:python depends on org@
 97p << r.p;
 98@@
 99
100coccilib.org.print_todo(p[0],
101  "WARNING: opportunity for kzfree/kvfree_sensitive")