Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /// Find a use after free.
0003 //# Values of variables may imply that some
0004 //# execution paths are not possible, resulting in false positives.
0005 //# Another source of false positives are macros such as
0006 //# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
0007 ///
0008 // Confidence: Moderate
0009 // Copyright: (C) 2010-2012 Nicolas Palix.
0010 // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
0011 // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
0012 // URL: https://coccinelle.gitlabpages.inria.fr/website
0013 // Comments:
0014 // Options: --no-includes --include-headers
0015 
0016 virtual org
0017 virtual report
0018 
0019 @free@
0020 expression E;
0021 position p1;
0022 @@
0023 
0024 (
0025  kfree@p1(E)
0026 |
0027  kfree_sensitive@p1(E)
0028 )
0029 
0030 @print expression@
0031 constant char [] c;
0032 expression free.E,E2;
0033 type T;
0034 position p;
0035 identifier f;
0036 @@
0037 
0038 (
0039  f(...,c,...,(T)E@p,...)
0040 |
0041  E@p == E2
0042 |
0043  E@p != E2
0044 |
0045  E2 == E@p
0046 |
0047  E2 != E@p
0048 |
0049  !E@p
0050 |
0051  E@p || ...
0052 )
0053 
0054 @sz@
0055 expression free.E;
0056 position p;
0057 @@
0058 
0059  sizeof(<+...E@p...+>)
0060 
0061 @loop exists@
0062 expression E;
0063 identifier l;
0064 position ok;
0065 @@
0066 
0067 while (1) { ...
0068 (
0069  kfree@ok(E)
0070 |
0071  kfree_sensitive@ok(E)
0072 )
0073   ... when != break;
0074       when != goto l;
0075       when forall
0076 }
0077 
0078 @r exists@
0079 expression free.E, subE<=free.E, E2;
0080 expression E1;
0081 iterator iter;
0082 statement S;
0083 position free.p1!=loop.ok,p2!={print.p,sz.p};
0084 @@
0085 
0086 (
0087  kfree@p1(E,...)
0088 |
0089  kfree_sensitive@p1(E,...)
0090 )
0091 ...
0092 (
0093  iter(...,subE,...) S // no use
0094 |
0095  list_remove_head(E1,subE,...)
0096 |
0097  subE = E2
0098 |
0099  subE++
0100 |
0101  ++subE
0102 |
0103  --subE
0104 |
0105  subE--
0106 |
0107  &subE
0108 |
0109  BUG(...)
0110 |
0111  BUG_ON(...)
0112 |
0113  return_VALUE(...)
0114 |
0115  return_ACPI_STATUS(...)
0116 |
0117  E@p2 // bad use
0118 )
0119 
0120 @script:python depends on org@
0121 p1 << free.p1;
0122 p2 << r.p2;
0123 @@
0124 
0125 cocci.print_main("kfree",p1)
0126 cocci.print_secs("ref",p2)
0127 
0128 @script:python depends on report@
0129 p1 << free.p1;
0130 p2 << r.p2;
0131 @@
0132 
0133 msg = "ERROR: reference preceded by free on line %s" % (p1[0].line)
0134 coccilib.report.print_report(p2[0],msg)