/// Use kmemdup_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. | |
// URL: http://coccinelle.lip6.fr/ | |
// Comments: | |
// Options: -no_includes -include_headers | |
virtual patch | |
@@ | |
expression from,to,size,flag; | |
position p; | |
identifier l1,l2; | |
@@ | |
- to = \(kmalloc@p\|kzalloc@p\)(size,flag); | |
+ to = memdup_user(from,size); | |
if ( | |
- to==NULL | |
+ IS_ERR(to) | |
|| ...) { | |
<+... when != goto l1; | |
- -ENOMEM | |
+ PTR_ERR(to) | |
...+> | |
} | |
- if (copy_from_user(to, from, size) != 0) { | |
- <+... when != goto l2; | |
- -EFAULT | |
- ...+> | |
- } |