On Fri, Feb 25, 2022 at 2:16 PM Kees Cook keescook@chromium.org wrote:
diff --git a/include/linux/slab.h b/include/linux/slab.h index 37bde99b74af..a14f3bfa2f44 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -182,8 +182,32 @@ int kmem_cache_shrink(struct kmem_cache *s); void * __must_check krealloc(const void *objp, size_t new_size, gfp_t flags) __alloc_size(2); void kfree(const void *objp); void kfree_sensitive(const void *objp);
+/**
- ksize - get the actual amount of memory allocated for a given object
- @objp: Pointer to the object
- kmalloc may internally round up allocations and return more memory
- than requested. ksize() can be used to determine the actual amount of
- memory allocated. The caller may use this additional memory, even though
- a smaller amount of memory was initially specified with the kmalloc call.
- The caller must guarantee that objp points to a valid object previously
- allocated with either kmalloc() or kmem_cache_alloc(). The object
- must not be freed during the duration of the call.
- Return: size of the actual memory used by @objp in bytes
- */
+#define ksize(objp) ({ \
/* \
* Getting the actual allocation size means the __alloc_size \
* hints are no longer valid, and the compiler needs to \
* forget about them. \
*/ \
OPTIMIZER_HIDE_VAR(objp); \
_ksize(objp); \
+}) size_t __ksize(const void *objp); -size_t ksize(const void *objp); +size_t _ksize(const void *objp);
If you wanted to discourage others from calling _ksize, you could hide its declaration within the scope of statement expression within ksize: https://godbolt.org/z/e4sd4nE6q