1/// Use kmemdup_user rather than duplicating its implementation
2/// This is a little bit restricted to reduce false positives
3///
4// Confidence: High
5// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
6// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
7// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
8// URL: http://coccinelle.lip6.fr/
9// Comments:
10// Options: -no_includes -include_headers
11
12virtual patch
13
14@@
15expression from,to,size,flag;
16position p;
17identifier l1,l2;
18@@
19
20-  to = \(kmalloc@p\|kzalloc@p\)(size,flag);
21+  to = memdup_user(from,size);
22   if (
23-      to==NULL
24+      IS_ERR(to)
25                 || ...) {
26   <+... when != goto l1;
27-  -ENOMEM
28+  PTR_ERR(to)
29   ...+>
30   }
31-  if (copy_from_user(to, from, size) != 0) {
32-    <+... when != goto l2;
33-    -EFAULT
34-    ...+>
35-  }
36