Skip to content

Commit

Permalink
Coccinelle: Add free/kfree.cocci
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nicolas Palix authored and Michal Marek committed Aug 31, 2010
1 parent 5c34050 commit 43ba21b
Showing 1 changed file with 116 additions and 0 deletions.
116 changes: 116 additions & 0 deletions scripts/coccinelle/free/kfree.cocci
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/// 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
///
// Confidence: Moderate
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual org
virtual report

@free@
expression E;
position p1;
@@

kfree@p1(E)

@print expression@
constant char *c;
expression free.E,E2;
type T;
position p;
identifier f;
@@

(
f(...,c,...,(T)E@p,...)
|
E@p == E2
|
E@p != E2
|
!E@p
|
E@p || ...
)

@sz@
expression free.E;
position p;
@@

sizeof(<+...E@p...+>)

@loop exists@
expression E;
identifier l;
position ok;
@@

while (1) { ...
kfree@ok(E)
... when != break;
when != goto l;
when forall
}

@r exists@
expression free.E, subE<=free.E, E2;
expression E1;
iterator iter;
statement S;
position free.p1!=loop.ok,p2!={print.p,sz.p};
@@

kfree@p1(E,...)
...
(
iter(...,subE,...) S // no use
|
list_remove_head(E1,subE,...)
|
subE = E2
|
subE++
|
++subE
|
--subE
|
subE--
|
&subE
|
BUG(...)
|
BUG_ON(...)
|
return_VALUE(...)
|
return_ACPI_STATUS(...)
|
E@p2 // bad use
)

@script:python depends on org@
p1 << free.p1;
p2 << r.p2;
@@
cocci.print_main("kfree",p1)
cocci.print_secs("ref",p2)
@script:python depends on report@
p1 << free.p1;
p2 << r.p2;
@@
msg = "reference preceded by free on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0],msg)

0 comments on commit 43ba21b

Please sign in to comment.