kfree_mismatch.cocci 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. ///
  3. /// Check that kvmalloc'ed memory is freed by kfree functions,
  4. /// vmalloc'ed by vfree functions and kvmalloc'ed by kvfree
  5. /// functions.
  6. ///
  7. // Confidence: High
  8. // Copyright: (C) 2020 Denis Efremov ISPRAS
  9. // Options: --no-includes --include-headers
  10. //
  11. virtual patch
  12. virtual report
  13. virtual org
  14. virtual context
  15. @alloc@
  16. expression E, E1;
  17. position kok, vok;
  18. @@
  19. (
  20. if (...) {
  21. ...
  22. E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|
  23. kmalloc_node\|kzalloc_node\|kmalloc_array\|
  24. kmalloc_array_node\|kcalloc_node\)(...)@kok
  25. ...
  26. } else {
  27. ...
  28. E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
  29. vzalloc_node\|vmalloc_exec\|vmalloc_32\|
  30. vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
  31. __vmalloc_node\)(...)@vok
  32. ...
  33. }
  34. |
  35. E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|kzalloc_node\|
  36. kmalloc_array\|kmalloc_array_node\|kcalloc_node\)(...)@kok
  37. ... when != E = E1
  38. when any
  39. if (E == NULL) {
  40. ...
  41. E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|
  42. vzalloc_node\|vmalloc_exec\|vmalloc_32\|
  43. vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|
  44. __vmalloc_node\)(...)@vok
  45. ...
  46. }
  47. )
  48. @free@
  49. expression E;
  50. position fok;
  51. @@
  52. E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
  53. kvmalloc_array\)(...)
  54. ...
  55. kvfree(E)@fok
  56. @vfree depends on !patch@
  57. expression E;
  58. position a != alloc.kok;
  59. position f != free.fok;
  60. @@
  61. * E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
  62. * kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
  63. * kcalloc_node\)(...)@a
  64. ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
  65. when != is_vmalloc_addr(E)
  66. when any
  67. * \(vfree\|vfree_atomic\|kvfree\)(E)@f
  68. @depends on patch exists@
  69. expression E;
  70. position a != alloc.kok;
  71. position f != free.fok;
  72. @@
  73. E = \(kmalloc\|kzalloc\|krealloc\|kcalloc\|kmalloc_node\|
  74. kzalloc_node\|kmalloc_array\|kmalloc_array_node\|
  75. kcalloc_node\)(...)@a
  76. ... when != if (...) { ... E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|__vmalloc_node_range\|__vmalloc_node\)(...); ... }
  77. when != is_vmalloc_addr(E)
  78. when any
  79. - \(vfree\|vfree_atomic\|kvfree\)(E)@f
  80. + kfree(E)
  81. @kfree depends on !patch@
  82. expression E;
  83. position a != alloc.vok;
  84. position f != free.fok;
  85. @@
  86. * E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
  87. * vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
  88. * __vmalloc_node_range\|__vmalloc_node\)(...)@a
  89. ... when != is_vmalloc_addr(E)
  90. when any
  91. * \(kfree\|kfree_sensitive\|kvfree\)(E)@f
  92. @depends on patch exists@
  93. expression E;
  94. position a != alloc.vok;
  95. position f != free.fok;
  96. @@
  97. E = \(vmalloc\|vzalloc\|vmalloc_user\|vmalloc_node\|vzalloc_node\|
  98. vmalloc_exec\|vmalloc_32\|vmalloc_32_user\|__vmalloc\|
  99. __vmalloc_node_range\|__vmalloc_node\)(...)@a
  100. ... when != is_vmalloc_addr(E)
  101. when any
  102. - \(kfree\|kvfree\)(E)@f
  103. + vfree(E)
  104. @kvfree depends on !patch@
  105. expression E;
  106. position a, f;
  107. @@
  108. * E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
  109. * kvmalloc_array\)(...)@a
  110. ... when != is_vmalloc_addr(E)
  111. when any
  112. * \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
  113. @depends on patch exists@
  114. expression E;
  115. @@
  116. E = \(kvmalloc\|kvzalloc\|kvcalloc\|kvzalloc_node\|kvmalloc_node\|
  117. kvmalloc_array\)(...)
  118. ... when != is_vmalloc_addr(E)
  119. when any
  120. - \(kfree\|vfree\)(E)
  121. + kvfree(E)
  122. @kvfree_switch depends on !patch@
  123. expression alloc.E;
  124. position f;
  125. @@
  126. ... when != is_vmalloc_addr(E)
  127. when any
  128. * \(kfree\|kfree_sensitive\|vfree\|vfree_atomic\)(E)@f
  129. @depends on patch exists@
  130. expression alloc.E;
  131. position f;
  132. @@
  133. ... when != is_vmalloc_addr(E)
  134. when any
  135. (
  136. - \(kfree\|vfree\)(E)@f
  137. + kvfree(E)
  138. |
  139. - kfree_sensitive(E)@f
  140. + kvfree_sensitive(E)
  141. )
  142. @script: python depends on report@
  143. a << vfree.a;
  144. f << vfree.f;
  145. @@
  146. msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
  147. coccilib.report.print_report(f[0], msg)
  148. @script: python depends on org@
  149. a << vfree.a;
  150. f << vfree.f;
  151. @@
  152. msg = "WARNING kmalloc is used to allocate this memory at line %s" % (a[0].line)
  153. coccilib.org.print_todo(f[0], msg)
  154. @script: python depends on report@
  155. a << kfree.a;
  156. f << kfree.f;
  157. @@
  158. msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
  159. coccilib.report.print_report(f[0], msg)
  160. @script: python depends on org@
  161. a << kfree.a;
  162. f << kfree.f;
  163. @@
  164. msg = "WARNING vmalloc is used to allocate this memory at line %s" % (a[0].line)
  165. coccilib.org.print_todo(f[0], msg)
  166. @script: python depends on report@
  167. a << kvfree.a;
  168. f << kvfree.f;
  169. @@
  170. msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
  171. coccilib.report.print_report(f[0], msg)
  172. @script: python depends on org@
  173. a << kvfree.a;
  174. f << kvfree.f;
  175. @@
  176. msg = "WARNING kvmalloc is used to allocate this memory at line %s" % (a[0].line)
  177. coccilib.org.print_todo(f[0], msg)
  178. @script: python depends on report@
  179. ka << alloc.kok;
  180. va << alloc.vok;
  181. f << kvfree_switch.f;
  182. @@
  183. msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
  184. coccilib.report.print_report(f[0], msg)
  185. @script: python depends on org@
  186. ka << alloc.kok;
  187. va << alloc.vok;
  188. f << kvfree_switch.f;
  189. @@
  190. msg = "WARNING kmalloc (line %s) && vmalloc (line %s) are used to allocate this memory" % (ka[0].line, va[0].line)
  191. coccilib.org.print_todo(f[0], msg)