linux/scripts/coccinelle/api/memdup_user.cocci
<<
>>
Prefs
   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