Commit 43ba21b57a3e757000bfa8ccf46c81f232b4d881

Authored by Nicolas Palix
Committed by Michal Marek
1 parent 5c34050188

Coccinelle: Add free/kfree.cocci

Find a use after free.  Values of variables may imply that some
execution paths are not possible, resulting in false positives.
Another source of false positives are macros such as
SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument

Signed-off-by: Nicolas Palix <npalix@diku.dk>
Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Michal Marek <mmarek@suse.cz>

Showing 1 changed file with 116 additions and 0 deletions Side-by-side Diff

scripts/coccinelle/free/kfree.cocci
  1 +/// Find a use after free. Values of variables may imply that some
  2 +/// execution paths are not possible, resulting in false positives.
  3 +/// Another source of false positives are macros such as
  4 +/// SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
  5 +///
  6 +// Confidence: Moderate
  7 +// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
  8 +// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
  9 +// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  10 +// URL: http://coccinelle.lip6.fr/
  11 +// Comments:
  12 +// Options: -no_includes -include_headers
  13 +
  14 +virtual org
  15 +virtual report
  16 +
  17 +@free@
  18 +expression E;
  19 +position p1;
  20 +@@
  21 +
  22 +kfree@p1(E)
  23 +
  24 +@print expression@
  25 +constant char *c;
  26 +expression free.E,E2;
  27 +type T;
  28 +position p;
  29 +identifier f;
  30 +@@
  31 +
  32 +(
  33 + f(...,c,...,(T)E@p,...)
  34 +|
  35 + E@p == E2
  36 +|
  37 + E@p != E2
  38 +|
  39 + !E@p
  40 +|
  41 + E@p || ...
  42 +)
  43 +
  44 +@sz@
  45 +expression free.E;
  46 +position p;
  47 +@@
  48 +
  49 + sizeof(<+...E@p...+>)
  50 +
  51 +@loop exists@
  52 +expression E;
  53 +identifier l;
  54 +position ok;
  55 +@@
  56 +
  57 +while (1) { ...
  58 + kfree@ok(E)
  59 + ... when != break;
  60 + when != goto l;
  61 + when forall
  62 +}
  63 +
  64 +@r exists@
  65 +expression free.E, subE<=free.E, E2;
  66 +expression E1;
  67 +iterator iter;
  68 +statement S;
  69 +position free.p1!=loop.ok,p2!={print.p,sz.p};
  70 +@@
  71 +
  72 +kfree@p1(E,...)
  73 +...
  74 +(
  75 + iter(...,subE,...) S // no use
  76 +|
  77 + list_remove_head(E1,subE,...)
  78 +|
  79 + subE = E2
  80 +|
  81 + subE++
  82 +|
  83 + ++subE
  84 +|
  85 + --subE
  86 +|
  87 + subE--
  88 +|
  89 + &subE
  90 +|
  91 + BUG(...)
  92 +|
  93 + BUG_ON(...)
  94 +|
  95 + return_VALUE(...)
  96 +|
  97 + return_ACPI_STATUS(...)
  98 +|
  99 + E@p2 // bad use
  100 +)
  101 +
  102 +@script:python depends on org@
  103 +p1 << free.p1;
  104 +p2 << r.p2;
  105 +@@
  106 +
  107 +cocci.print_main("kfree",p1)
  108 +cocci.print_secs("ref",p2)
  109 +
  110 +@script:python depends on report@
  111 +p1 << free.p1;
  112 +p2 << r.p2;
  113 +@@
  114 +
  115 +msg = "reference preceded by free on line %s" % (p1[0].line)
  116 +coccilib.report.print_report(p2[0],msg)