Commit b19d57d0 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by Kees Cook

overflow.h: Add flex_array_size() helper

Add flex_array_size() helper for the calculation of the size, in bytes,
of a flexible array member contained within an enclosing structure.

Example of usage:

struct something {
	size_t count;
	struct foo items[];
};

struct something *instance;

instance = kmalloc(struct_size(instance, items, count), GFP_KERNEL);
instance->count = count;
memcpy(instance->items, src, flex_array_size(instance, items, instance->count));

The helper returns SIZE_MAX on overflow instead of wrapping around.

Additionally replaces parameter "n" with "count" in struct_size() helper
for greater clarity and unification.
Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/20200609012233.GA3371@embeddedorSigned-off-by: default avatarKees Cook <keescook@chromium.org>
parent b3a9e3b9
...@@ -304,16 +304,33 @@ static inline __must_check size_t __ab_c_size(size_t a, size_t b, size_t c) ...@@ -304,16 +304,33 @@ static inline __must_check size_t __ab_c_size(size_t a, size_t b, size_t c)
* struct_size() - Calculate size of structure with trailing array. * struct_size() - Calculate size of structure with trailing array.
* @p: Pointer to the structure. * @p: Pointer to the structure.
* @member: Name of the array member. * @member: Name of the array member.
* @n: Number of elements in the array. * @count: Number of elements in the array.
* *
* Calculates size of memory needed for structure @p followed by an * Calculates size of memory needed for structure @p followed by an
* array of @n @member elements. * array of @count number of @member elements.
* *
* Return: number of bytes needed or SIZE_MAX on overflow. * Return: number of bytes needed or SIZE_MAX on overflow.
*/ */
#define struct_size(p, member, n) \ #define struct_size(p, member, count) \
__ab_c_size(n, \ __ab_c_size(count, \
sizeof(*(p)->member) + __must_be_array((p)->member),\ sizeof(*(p)->member) + __must_be_array((p)->member),\
sizeof(*(p))) sizeof(*(p)))
/**
* flex_array_size() - Calculate size of a flexible array member
* within an enclosing structure.
*
* @p: Pointer to the structure.
* @member: Name of the flexible array member.
* @count: Number of elements in the array.
*
* Calculates size of a flexible array of @count number of @member
* elements, at the end of structure @p.
*
* Return: number of bytes needed or SIZE_MAX on overflow.
*/
#define flex_array_size(p, member, count) \
array_size(count, \
sizeof(*(p)->member) + __must_be_array((p)->member))
#endif /* __LINUX_OVERFLOW_H */ #endif /* __LINUX_OVERFLOW_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment