Re: [PATCH v2 1/3] coccinelle: also catch kzfree() issues

From: Julia Lawall
Date: Mon May 23 2016 - 11:18:14 EST




On Mon, 23 May 2016, Yann Droneaud wrote:

> Since commit 3ef0e5ba4673 ('slab: introduce kzfree()'),
> kfree() is no more the only function to be considered:
> kzfree() should be recognized too.
>
> In particular, kzfree() must not be called on memory
> allocated through devm_*() functions.
>
> Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
> Signed-off-by: Yann Droneaud <ydroneaud@xxxxxxxxxx>

Acked-by: Julia Lawall <julia.lawall@xxxxxxx>

> ---
> scripts/coccinelle/free/devm_free.cocci | 2 ++
> scripts/coccinelle/free/ifnullfree.cocci | 4 +++-
> scripts/coccinelle/free/kfree.cocci | 18 +++++++++++++++---
> scripts/coccinelle/free/kfreeaddr.cocci | 6 +++++-
> 4 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/scripts/coccinelle/free/devm_free.cocci b/scripts/coccinelle/free/devm_free.cocci
> index 3d9349012bb3..83c03adec1c5 100644
> --- a/scripts/coccinelle/free/devm_free.cocci
> +++ b/scripts/coccinelle/free/devm_free.cocci
> @@ -48,6 +48,8 @@ position p;
> (
> * kfree@p(x)
> |
> +* kzfree@p(x)
> +|
> * free_irq@p(x)
> |
> * iounmap@p(x)
> diff --git a/scripts/coccinelle/free/ifnullfree.cocci b/scripts/coccinelle/free/ifnullfree.cocci
> index 52bd235286fa..14a4cd98e83b 100644
> --- a/scripts/coccinelle/free/ifnullfree.cocci
> +++ b/scripts/coccinelle/free/ifnullfree.cocci
> @@ -20,6 +20,8 @@ expression E;
> (
> kfree(E);
> |
> + kzfree(E);
> +|
> debugfs_remove(E);
> |
> debugfs_remove_recursive(E);
> @@ -39,7 +41,7 @@ position p;
> @@
>
> * if (E != NULL)
> -* \(kfree@p\|debugfs_remove@p\|debugfs_remove_recursive@p\|
> +* \(kfree@p\|kzfree@p\|debugfs_remove@p\|debugfs_remove_recursive@p\|
> * usb_free_urb@p\|kmem_cache_destroy@p\|mempool_destroy@p\|
> * dma_pool_destroy@p\)(E);
>
> diff --git a/scripts/coccinelle/free/kfree.cocci b/scripts/coccinelle/free/kfree.cocci
> index 577b78056990..ac438da4fd7b 100644
> --- a/scripts/coccinelle/free/kfree.cocci
> +++ b/scripts/coccinelle/free/kfree.cocci
> @@ -20,7 +20,11 @@ expression E;
> position p1;
> @@
>
> -kfree@p1(E)
> +(
> +* kfree@p1(E)
> +|
> +* kzfree@p1(E)
> +)
>
> @print expression@
> constant char [] c;
> @@ -60,7 +64,11 @@ position ok;
> @@
>
> while (1) { ...
> - kfree@ok(E)
> +(
> +* kfree@ok(E)
> +|
> +* kzfree@ok(E)
> +)
> ... when != break;
> when != goto l;
> when forall
> @@ -74,7 +82,11 @@ statement S;
> position free.p1!=loop.ok,p2!={print.p,sz.p};
> @@
>
> -kfree@p1(E,...)
> +(
> +* kfree@p1(E,...)
> +|
> +* kzfree@p1(E,...)
> +)
> ...
> (
> iter(...,subE,...) S // no use
> diff --git a/scripts/coccinelle/free/kfreeaddr.cocci b/scripts/coccinelle/free/kfreeaddr.cocci
> index ce8aacc314cb..d46063b1db8b 100644
> --- a/scripts/coccinelle/free/kfreeaddr.cocci
> +++ b/scripts/coccinelle/free/kfreeaddr.cocci
> @@ -16,7 +16,11 @@ identifier f;
> position p;
> @@
>
> +(
> * kfree@p(&e->f)
> +|
> +* kzfree@p(&e->f)
> +)
>
> @script:python depends on org@
> p << r.p;
> @@ -28,5 +32,5 @@ cocci.print_main("kfree",p)
> p << r.p;
> @@
>
> -msg = "ERROR: kfree of structure field"
> +msg = "ERROR: invalid free of structure field"
> coccilib.report.print_report(p[0],msg)
> --
> 2.7.4
>
>