memdup_user.cocci 799 B

1234567891011121314151617181920212223242526272829303132333435
  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. virtual patch
  12. @@
  13. expression from,to,size,flag;
  14. position p;
  15. identifier l1,l2;
  16. @@
  17. - to = \(kmalloc@p\|kzalloc@p\)(size,flag);
  18. + to = memdup_user(from,size);
  19. if (
  20. - to==NULL
  21. + IS_ERR(to)
  22. || ...) {
  23. <+... when != goto l1;
  24. - -ENOMEM
  25. + PTR_ERR(to)
  26. ...+>
  27. }
  28. - if (copy_from_user(to, from, size) != 0) {
  29. - <+... when != goto l2;
  30. - -EFAULT
  31. - ...+>
  32. - }