devm_free.cocci 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /// Find uses of standard freeing functons on values allocated using devm_
  2. /// functions. Values allocated using the devm_functions are freed when
  3. /// the device is detached, and thus the use of the standard freeing
  4. /// function would cause a double free.
  5. /// See Documentation/driver-model/devres.txt for more information.
  6. ///
  7. /// A difficulty of detecting this problem is that the standard freeing
  8. /// function might be called from a different function than the one
  9. /// containing the allocation function. It is thus necessary to make the
  10. /// connection between the allocation function and the freeing function.
  11. /// Here this is done using the specific argument text, which is prone to
  12. /// false positives. There is no rule for the request_region and
  13. /// request_mem_region variants because this heuristic seems to be a bit
  14. /// less reliable in these cases.
  15. ///
  16. // Confidence: Moderate
  17. // Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. GPLv2.
  18. // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. GPLv2.
  19. // URL: http://coccinelle.lip6.fr/
  20. // Comments:
  21. // Options: --no-includes --include-headers
  22. virtual org
  23. virtual report
  24. virtual context
  25. @r depends on context || org || report@
  26. expression x;
  27. @@
  28. (
  29. x = devm_kzalloc(...)
  30. |
  31. x = devm_request_irq(...)
  32. |
  33. x = devm_ioremap(...)
  34. |
  35. x = devm_ioremap_nocache(...)
  36. |
  37. x = devm_ioport_map(...)
  38. )
  39. @pb@
  40. expression r.x;
  41. position p;
  42. @@
  43. (
  44. * kfree@p(x)
  45. |
  46. * free_irq@p(x)
  47. |
  48. * iounmap@p(x)
  49. |
  50. * ioport_unmap@p(x)
  51. )
  52. @script:python depends on org@
  53. p << pb.p;
  54. @@
  55. msg="WARNING: invalid free of devm_ allocated data"
  56. coccilib.org.print_todo(p[0], msg)
  57. @script:python depends on report@
  58. p << pb.p;
  59. @@
  60. msg="WARNING: invalid free of devm_ allocated data"
  61. coccilib.report.print_report(p[0], msg)