The cleanup infrastructure was added to barebox a while back in
commit 332e3542e5ed ("Port Linux __cleanup() based guard
infrastructure"), but without any DEFINE_FREE() handlers, so nothing
could be passed to __free() so far.

Let's start with malloc and kmalloc, so buffers can be tied to the
scope they are used in:

        void *buf __free(free)  =  malloc(size);
        void *foo __free(kfree) = kzalloc(size, GFP_KERNEL);

[k]free_sensitive() looks up the usable size of the buffer before
zeroing it, so it gets the same test rather than just a NULL check
to avoid an error pointer dereference inside the allocator.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 include/linux/slab.h | 5 +++++
 include/malloc.h     | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/include/linux/slab.h b/include/linux/slab.h
index 93ce25a58299..9ccb8c6a0101 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -4,6 +4,8 @@
 #define _LINUX_SLAB_H
 
 #include <dma.h>
+#include <linux/cleanup.h>
+#include <linux/err.h>
 #include <linux/overflow.h>
 #include <linux/string.h>
 #include <linux/gfp.h>
@@ -116,4 +118,7 @@ static inline char *kstrdup(const char *str, gfp_t flags)
 
 #define kstrdup_const(str, flags) strdup_const(str)
 
+DEFINE_FREE(kfree, void *, if (!IS_ERR_OR_NULL(_T)) kfree(_T))
+DEFINE_FREE(kfree_sensitive, void *, if (!IS_ERR_OR_NULL(_T)) 
kfree_sensitive(_T))
+
 #endif /* _LINUX_SLAB_H */
diff --git a/include/malloc.h b/include/malloc.h
index 82fa2bb39c8e..b7f1aaac95d2 100644
--- a/include/malloc.h
+++ b/include/malloc.h
@@ -2,7 +2,9 @@
 #ifndef __MALLOC_H
 #define __MALLOC_H
 
+#include <linux/cleanup.h>
 #include <linux/compiler.h>
+#include <linux/err.h>
 #include <types.h>
 
 #define MALLOC_SHIFT_MAX       30
@@ -81,6 +83,9 @@ static inline int mem_malloc_is_initialized(void)
 }
 #endif
 
+DEFINE_FREE(free, void *, if (!IS_ERR_OR_NULL(_T)) free(_T))
+DEFINE_FREE(free_sensitive, void *, if (!IS_ERR_OR_NULL(_T)) 
free_sensitive(_T))
+
 static inline bool want_init_on_alloc(void)
 {
        return IS_ENABLED(CONFIG_INIT_ON_ALLOC_DEFAULT_ON);
-- 
2.47.3


Reply via email to