diff options
Diffstat (limited to 'scripts/coccinelle/api')
| -rw-r--r-- | scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci | 2 | ||||
| -rw-r--r-- | scripts/coccinelle/api/alloc/kzalloc-simple.cocci | 2 | ||||
| -rw-r--r-- | scripts/coccinelle/api/d_find_alias.cocci | 80 | ||||
| -rw-r--r-- | scripts/coccinelle/api/devm_ioremap_resource.cocci | 90 | ||||
| -rw-r--r-- | scripts/coccinelle/api/kstrdup.cocci | 77 | ||||
| -rw-r--r-- | scripts/coccinelle/api/memdup.cocci | 36 | ||||
| -rw-r--r-- | scripts/coccinelle/api/memdup_user.cocci | 41 | ||||
| -rw-r--r-- | scripts/coccinelle/api/pm_runtime.cocci | 109 | ||||
| -rw-r--r-- | scripts/coccinelle/api/ptr_ret.cocci | 96 | ||||
| -rw-r--r-- | scripts/coccinelle/api/simple_open.cocci | 70 | 
10 files changed, 582 insertions, 21 deletions
diff --git a/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci b/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci index 7d4771d449c..bd5d08b882e 100644 --- a/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci +++ b/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci @@ -5,7 +5,7 @@  // Confidence: High  // Copyright: 2009,2010 Nicolas Palix, DIKU.  GPLv2.  // URL: http://coccinelle.lip6.fr/ -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  //  // Keywords: kmalloc, kzalloc, kcalloc  // Version min: < 2.6.12 kmalloc diff --git a/scripts/coccinelle/api/alloc/kzalloc-simple.cocci b/scripts/coccinelle/api/alloc/kzalloc-simple.cocci index 046b9b16f8f..52c55e4fa67 100644 --- a/scripts/coccinelle/api/alloc/kzalloc-simple.cocci +++ b/scripts/coccinelle/api/alloc/kzalloc-simple.cocci @@ -9,7 +9,7 @@  // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.  GPLv2.  // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/rules/kzalloc.html -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  //  // Keywords: kmalloc, kzalloc  // Version min: < 2.6.12 kmalloc diff --git a/scripts/coccinelle/api/d_find_alias.cocci b/scripts/coccinelle/api/d_find_alias.cocci new file mode 100644 index 00000000000..9594c9f7eb8 --- /dev/null +++ b/scripts/coccinelle/api/d_find_alias.cocci @@ -0,0 +1,80 @@ +/// Make sure calls to d_find_alias() have a corresponding call to dput(). +// +// Keywords: d_find_alias, dput +// +// Confidence: Moderate +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers + +virtual context +virtual org +virtual patch +virtual report + +@r exists@ +local idexpression struct dentry *dent; +expression E, E1; +statement S1, S2; +position p1, p2; +@@ +( +	if (!(dent@p1 = d_find_alias(...))) S1 +| +	dent@p1 = d_find_alias(...) +) + +<...when != dput(dent) +    when != if (...) { <+... dput(dent) ...+> } +    when != true !dent || ... +    when != dent = E +    when != E = dent +if (!dent || ...) S2 +...> +( +	return <+...dent...+>; +| +	return @p2 ...; +| +	dent@p2 = E1; +| +	E1 = dent; +) + +@depends on context@ +local idexpression struct dentry *r.dent; +position r.p1,r.p2; +@@ +* dent@p1 = ... +  ... +( +* return@p2 ...; +| +* dent@p2 +) + + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +@@ +cocci.print_main("Missing call to dput()",p1) +cocci.print_secs("",p2) + +@depends on patch@ +local idexpression struct dentry *r.dent; +position r.p2; +@@ +( ++ dput(dent); +  return @p2 ...; +| ++ dput(dent); +  dent@p2 = ...; +) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +@@ +msg = "Missing call to dput() at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) diff --git a/scripts/coccinelle/api/devm_ioremap_resource.cocci b/scripts/coccinelle/api/devm_ioremap_resource.cocci new file mode 100644 index 00000000000..495daa3dbf7 --- /dev/null +++ b/scripts/coccinelle/api/devm_ioremap_resource.cocci @@ -0,0 +1,90 @@ +virtual patch +virtual report + +@depends on patch@ +expression base, dev, res; +@@ + +-base = devm_request_and_ioremap(dev, res); ++base = devm_ioremap_resource(dev, res); + ... + if ( +-base == NULL ++IS_ERR(base) + || ...) { +<... +-	return ...; ++	return PTR_ERR(base); +...> + } + +@depends on patch@ +expression e, E, ret; +identifier l; +@@ + + e = devm_ioremap_resource(...); + ... + if (IS_ERR(e) || ...) { + 	... when any +-	ret = E; ++	ret = PTR_ERR(e); + 	... +( + 	return ret; +| + 	goto l; +) + } + +@depends on patch@ +expression e; +@@ + + e = devm_ioremap_resource(...); + ... + if (IS_ERR(e) || ...) { + 	... +-	\(dev_dbg\|dev_err\|pr_debug\|pr_err\|DRM_ERROR\)(...); + 	... + } + +@depends on patch@ +expression e; +identifier l; +@@ + + e = devm_ioremap_resource(...); + ... + if (IS_ERR(e) || ...) +-{ +( + 	return ...; +| + 	goto l; +) +-} + +@r depends on report@ +expression e; +identifier l; +position p1; +@@ + +*e = devm_request_and_ioremap@p1(...); + ... + if (e == NULL || ...) { + 	... +( + 	return ...; +| + 	goto l; +) + } + +@script:python depends on r@ +p1 << r.p1; +@@ + +msg = "ERROR: deprecated devm_request_and_ioremap() API used on line %s" % (p1[0].line) +coccilib.report.print_report(p1[0], msg) diff --git a/scripts/coccinelle/api/kstrdup.cocci b/scripts/coccinelle/api/kstrdup.cocci index e0805ad08d3..09cba54ed0c 100644 --- a/scripts/coccinelle/api/kstrdup.cocci +++ b/scripts/coccinelle/api/kstrdup.cocci @@ -1,16 +1,19 @@  /// Use kstrdup rather than duplicating its implementation  ///  // Confidence: High -// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2. -// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2. -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2. +// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch +virtual context +virtual org +virtual report -@@ +@depends on patch@  expression from,to;  expression flag,E1,E2;  statement S; @@ -23,7 +26,7 @@ statement S;     ... when != \(from = E2 \| to = E2 \)  -  strcpy(to, from); -@@ +@depends on patch@  expression x,from,to;  expression flag,E1,E2,E3;  statement S; @@ -37,3 +40,65 @@ statement S;      if (to==NULL || ...) S      ... when != \(x = E3 \| from = E3 \| to = E3 \)  -   memcpy(to, from, x); + +// --------------------------------------------------------------------- + +@r1 depends on !patch exists@ +expression from,to; +expression flag,E1,E2; +statement S; +position p1,p2; +@@ + +*  to = kmalloc@p1(strlen(from) + 1,flag); +   ... when != \(from = E1 \| to = E1 \) +   if (to==NULL || ...) S +   ... when != \(from = E2 \| to = E2 \) +*  strcpy@p2(to, from); + +@r2 depends on !patch exists@ +expression x,from,to; +expression flag,E1,E2,E3; +statement S; +position p1,p2; +@@ + +*   x = strlen(from) + 1; +    ... when != \( x = E1 \| from = E1 \) +*   to = \(kmalloc@p1\|kzalloc@p2\)(x,flag); +    ... when != \(x = E2 \| from = E2 \| to = E2 \) +    if (to==NULL || ...) S +    ... when != \(x = E3 \| from = E3 \| to = E3 \) +*   memcpy@p2(to, from, x); + +@script:python depends on org@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +cocci.print_main("WARNING opportunity for kstrdep",p1) +cocci.print_secs("strcpy",p2) + +@script:python depends on org@ +p1 << r2.p1; +p2 << r2.p2; +@@ + +cocci.print_main("WARNING opportunity for kstrdep",p1) +cocci.print_secs("memcpy",p2) + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ + +msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) + +@script:python depends on report@ +p1 << r2.p1; +p2 << r2.p2; +@@ + +msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) +coccilib.report.print_report(p1[0], msg) diff --git a/scripts/coccinelle/api/memdup.cocci b/scripts/coccinelle/api/memdup.cocci index b5d722077dc..3d1aa71b757 100644 --- a/scripts/coccinelle/api/memdup.cocci +++ b/scripts/coccinelle/api/memdup.cocci @@ -1,14 +1,17 @@  /// Use kmemdup rather than duplicating its implementation  ///  // Confidence: High -// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2. -// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2. -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2. +// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch +virtual context +virtual org +virtual report  @r1@  expression from,to; @@ -28,7 +31,7 @@ position p;      ... when != \( x = E1 \| from = E1 \)      to = \(kmalloc@p\|kzalloc@p\)(x,flag); -@@ +@depends on patch@  expression from,to,size,flag;  position p != {r1.p,r2.p};  statement S; @@ -38,3 +41,26 @@ statement S;  +  to = kmemdup(from,size,flag);     if (to==NULL || ...) S  -  memcpy(to, from, size); + +@r depends on !patch@ +expression from,to,size,flag; +position p != {r1.p,r2.p}; +statement S; +@@ + +*  to = \(kmalloc@p\|kzalloc@p\)(size,flag); +   to = kmemdup(from,size,flag); +   if (to==NULL || ...) S +*  memcpy(to, from, size); + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for kmemdep") + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for kmemdep") diff --git a/scripts/coccinelle/api/memdup_user.cocci b/scripts/coccinelle/api/memdup_user.cocci index 72ce012e878..c606231b0e4 100644 --- a/scripts/coccinelle/api/memdup_user.cocci +++ b/scripts/coccinelle/api/memdup_user.cocci @@ -1,23 +1,25 @@ -/// Use kmemdup_user rather than duplicating its implementation +/// Use memdup_user rather than duplicating its implementation  /// This is a little bit restricted to reduce false positives  ///  // Confidence: High -// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2. -// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2. -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2. +// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2. +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2. +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch +virtual context +virtual org +virtual report -@@ +@depends on patch@  expression from,to,size,flag; -position p;  identifier l1,l2;  @@ --  to = \(kmalloc@p\|kzalloc@p\)(size,flag); +-  to = \(kmalloc\|kzalloc\)(size,flag);  +  to = memdup_user(from,size);     if (  -      to==NULL @@ -33,3 +35,26 @@ identifier l1,l2;  -    -EFAULT  -    ...+>  -  } + +@r depends on !patch@ +expression from,to,size,flag; +position p; +statement S1,S2; +@@ + +*  to = \(kmalloc@p\|kzalloc@p\)(size,flag); +   if (to==NULL || ...) S1 +   if (copy_from_user(to, from, size) != 0) +   S2 + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], "WARNING opportunity for memdup_user") + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], "WARNING opportunity for memdup_user") diff --git a/scripts/coccinelle/api/pm_runtime.cocci b/scripts/coccinelle/api/pm_runtime.cocci new file mode 100644 index 00000000000..f01789e967e --- /dev/null +++ b/scripts/coccinelle/api/pm_runtime.cocci @@ -0,0 +1,109 @@ +/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE +// +// Keywords: pm_runtime +// Confidence: Medium +// Copyright (C) 2013 Texas Instruments Incorporated - GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers + +virtual patch +virtual context +virtual org +virtual report + +//---------------------------------------------------------- +//  Detection +//---------------------------------------------------------- + +@runtime_bad_err_handle exists@ +expression ret; +@@ +( +ret = \(pm_runtime_idle\| +	pm_runtime_suspend\| +	pm_runtime_autosuspend\| +	pm_runtime_resume\| +	pm_request_idle\| +	pm_request_resume\| +	pm_request_autosuspend\| +	pm_runtime_get\| +	pm_runtime_get_sync\| +	pm_runtime_put\| +	pm_runtime_put_autosuspend\| +	pm_runtime_put_sync\| +	pm_runtime_put_sync_suspend\| +	pm_runtime_put_sync_autosuspend\| +	pm_runtime_set_active\| +	pm_schedule_suspend\| +	pm_runtime_barrier\| +	pm_generic_runtime_suspend\| +	pm_generic_runtime_resume\)(...); +... +IS_ERR_VALUE(ret) +... +) + +//---------------------------------------------------------- +//  For context mode +//---------------------------------------------------------- + +@depends on runtime_bad_err_handle && context@ +identifier pm_runtime_api; +expression ret; +@@ +( +ret = pm_runtime_api(...); +... +* IS_ERR_VALUE(ret) +... +) + +//---------------------------------------------------------- +//  For patch mode +//---------------------------------------------------------- + +@depends on runtime_bad_err_handle && patch@ +identifier pm_runtime_api; +expression ret; +@@ +( +ret = pm_runtime_api(...); +... +- IS_ERR_VALUE(ret) ++ ret < 0 +... +) + +//---------------------------------------------------------- +//  For org and report mode +//---------------------------------------------------------- + +@r depends on runtime_bad_err_handle exists@ +position p1, p2; +identifier pm_runtime_api; +expression ret; +@@ +( +ret = pm_runtime_api@p1(...); +... +IS_ERR_VALUE@p2(ret) +... +) + +@script:python depends on org@ +p1 << r.p1; +p2 << r.p2; +pm_runtime_api << r.pm_runtime_api; +@@ + +cocci.print_main(pm_runtime_api,p1) +cocci.print_secs("IS_ERR_VALUE",p2) + +@script:python depends on report@ +p1 << r.p1; +p2 << r.p2; +pm_runtime_api << r.pm_runtime_api; +@@ + +msg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line) +coccilib.report.print_report(p1[0],msg) diff --git a/scripts/coccinelle/api/ptr_ret.cocci b/scripts/coccinelle/api/ptr_ret.cocci new file mode 100644 index 00000000000..dd58dab5d41 --- /dev/null +++ b/scripts/coccinelle/api/ptr_ret.cocci @@ -0,0 +1,96 @@ +/// +/// Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR +/// +// Confidence: High +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2. +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers +// +// Keywords: ERR_PTR, PTR_ERR, PTR_ERR_OR_ZERO +// Version min: 2.6.39 +// + +virtual context +virtual patch +virtual org +virtual report + +@depends on patch@ +expression ptr; +@@ + +- if (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; ++ return PTR_ERR_OR_ZERO(ptr); + +@depends on patch@ +expression ptr; +@@ + +- if (IS_ERR(ptr)) return PTR_ERR(ptr); return 0; ++ return PTR_ERR_OR_ZERO(ptr); + +@depends on patch@ +expression ptr; +@@ + +- (IS_ERR(ptr) ? PTR_ERR(ptr) : 0) ++ PTR_ERR_OR_ZERO(ptr) + +@r1 depends on !patch@ +expression ptr; +position p1; +@@ + +* if@p1 (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; + +@r2 depends on !patch@ +expression ptr; +position p2; +@@ + +* if@p2 (IS_ERR(ptr)) return PTR_ERR(ptr); return 0; + +@r3 depends on !patch@ +expression ptr; +position p3; +@@ + +* IS_ERR@p3(ptr) ? PTR_ERR(ptr) : 0 + +@script:python depends on org@ +p << r1.p1; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + + +@script:python depends on org@ +p << r2.p2; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on org@ +p << r3.p3; +@@ + +coccilib.org.print_todo(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r1.p1; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r2.p2; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") + +@script:python depends on report@ +p << r3.p3; +@@ + +coccilib.report.print_report(p[0], "WARNING: PTR_ERR_OR_ZERO can be used") diff --git a/scripts/coccinelle/api/simple_open.cocci b/scripts/coccinelle/api/simple_open.cocci new file mode 100644 index 00000000000..b67e174f3d9 --- /dev/null +++ b/scripts/coccinelle/api/simple_open.cocci @@ -0,0 +1,70 @@ +/// This removes an open coded simple_open() function +/// and replaces file operations references to the function +/// with simple_open() instead. +/// +// Confidence: High +// Comments: +// Options: --no-includes --include-headers + +virtual patch +virtual report + +@ open depends on patch @ +identifier open_f != simple_open; +identifier i, f; +@@ +-int open_f(struct inode *i, struct file *f) +-{ +( +-if (i->i_private) +-f->private_data = i->i_private; +| +-f->private_data = i->i_private; +) +-return 0; +-} + +@ has_open depends on open @ +identifier fops; +identifier open.open_f; +@@ +struct file_operations fops = { +..., +-.open = open_f, ++.open = simple_open, +... +}; + +@ openr depends on report @ +identifier open_f != simple_open; +identifier i, f; +position p; +@@ +int open_f@p(struct inode *i, struct file *f) +{ +( +if (i->i_private) +f->private_data = i->i_private; +| +f->private_data = i->i_private; +) +return 0; +} + +@ has_openr depends on openr @ +identifier fops; +identifier openr.open_f; +position p; +@@ +struct file_operations fops = { +..., +.open = open_f@p, +... +}; + +@script:python@ +pf << openr.p; +ps << has_openr.p; +@@ + +coccilib.report.print_report(pf[0],"WARNING opportunity for simple_open, see also structure on line %s"%(ps[0].line))  | 
