mm: add kvfree_sensitive() for freeing sensitive data objects
[sfrench/cifs-2.6.git] / mm / util.c
index fd9efe6bd463cc0bb8fc609d55f88993c984dbd3..cd62e6fb53186abd384c71a9fb3ffe913b13c6db 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -604,6 +604,24 @@ void kvfree(const void *addr)
 }
 EXPORT_SYMBOL(kvfree);
 
+/**
+ * kvfree_sensitive - Free a data object containing sensitive information.
+ * @addr: address of the data object to be freed.
+ * @len: length of the data object.
+ *
+ * Use the special memzero_explicit() function to clear the content of a
+ * kvmalloc'ed object containing sensitive data to make sure that the
+ * compiler won't optimize out the data clearing.
+ */
+void kvfree_sensitive(const void *addr, size_t len)
+{
+       if (likely(!ZERO_OR_NULL_PTR(addr))) {
+               memzero_explicit((void *)addr, len);
+               kvfree(addr);
+       }
+}
+EXPORT_SYMBOL(kvfree_sensitive);
+
 static inline void *__page_rmapping(struct page *page)
 {
        unsigned long mapping;