diff options
| author | Julia Lawall <Julia.Lawall@lip6.fr> | 2011-12-27 12:28:51 -0500 |
|---|---|---|
| committer | Michal Marek <mmarek@suse.cz> | 2012-01-14 16:40:04 -0500 |
| commit | fb3f8af4ff52faf9b31e6c4e8ca0b0b16332808c (patch) | |
| tree | 41aa64830b16a74300c0d6dd5f1323b373c86655 /scripts | |
| parent | 22e0059af301ec163d563c3590d2277c2a557d4f (diff) | |
coccinelle: semantic patches related to devm_ functions (part 2)
devm_ functions allocate memory that is to remain allocated until the
device is detached. This patch checks for freeing of such memory using
standard memory freeing functions.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Michal Marek <mmarek@suse.cz>
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/coccinelle/free/devm_free.cocci | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/scripts/coccinelle/free/devm_free.cocci b/scripts/coccinelle/free/devm_free.cocci new file mode 100644 index 000000000000..0a1e36146d76 --- /dev/null +++ b/scripts/coccinelle/free/devm_free.cocci | |||
| @@ -0,0 +1,71 @@ | |||
| 1 | /// Find uses of standard freeing functons on values allocated using devm_ | ||
| 2 | /// functions. Values allocated using the devm_functions are freed when | ||
| 3 | /// the device is detached, and thus the use of the standard freeing | ||
| 4 | /// function would cause a double free. | ||
| 5 | /// See Documentation/driver-model/devres.txt for more information. | ||
| 6 | /// | ||
| 7 | /// A difficulty of detecting this problem is that the standard freeing | ||
| 8 | /// function might be called from a different function than the one | ||
| 9 | /// containing the allocation function. It is thus necessary to make the | ||
| 10 | /// connection between the allocation function and the freeing function. | ||
| 11 | /// Here this is done using the specific argument text, which is prone to | ||
| 12 | /// false positives. There is no rule for the request_region and | ||
| 13 | /// request_mem_region variants because this heuristic seems to be a bit | ||
| 14 | /// less reliable in these cases. | ||
| 15 | /// | ||
| 16 | // Confidence: Moderate | ||
| 17 | // Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. GPLv2. | ||
| 18 | // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. GPLv2. | ||
| 19 | // URL: http://coccinelle.lip6.fr/ | ||
| 20 | // Comments: | ||
| 21 | // Options: -no_includes -include_headers | ||
| 22 | |||
| 23 | virtual org | ||
| 24 | virtual report | ||
| 25 | virtual context | ||
| 26 | |||
| 27 | @r depends on context || org || report@ | ||
| 28 | expression x; | ||
| 29 | @@ | ||
| 30 | |||
| 31 | ( | ||
| 32 | x = devm_kzalloc(...) | ||
| 33 | | | ||
| 34 | x = devm_request_irq(...) | ||
| 35 | | | ||
| 36 | x = devm_ioremap(...) | ||
| 37 | | | ||
| 38 | x = devm_ioremap_nocache(...) | ||
| 39 | | | ||
| 40 | x = devm_ioport_map(...) | ||
| 41 | ) | ||
| 42 | |||
| 43 | @pb@ | ||
| 44 | expression r.x; | ||
| 45 | position p; | ||
| 46 | @@ | ||
| 47 | |||
| 48 | ( | ||
| 49 | * kfree@p(x) | ||
| 50 | | | ||
| 51 | * free_irq@p(x) | ||
| 52 | | | ||
| 53 | * iounmap@p(x) | ||
| 54 | | | ||
| 55 | * ioport_unmap@p(x) | ||
| 56 | ) | ||
| 57 | |||
| 58 | @script:python depends on org@ | ||
| 59 | p << pb.p; | ||
| 60 | @@ | ||
| 61 | |||
| 62 | msg="WARNING: invalid free of devm_ allocated data" | ||
| 63 | coccilib.org.print_todo(p[0], msg) | ||
| 64 | |||
| 65 | @script:python depends on report@ | ||
| 66 | p << pb.p; | ||
| 67 | @@ | ||
| 68 | |||
| 69 | msg="WARNING: invalid free of devm_ allocated data" | ||
| 70 | coccilib.report.print_report(p[0], msg) | ||
| 71 | |||
