Messages in this thread Patch in this message | | | Date | Mon, 8 Jun 2020 17:17:23 -0500 | From | "Gustavo A. R. Silva" <> | Subject | [PATCH] 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, source, flex_array_size(instance, items, instance->count));
The helper returns SIZE_MAX on overflow instead of wrapping around.
(Additionally replace parameter n with count in struct_size() for homogeneity).
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- include/linux/overflow.h | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/include/linux/overflow.h b/include/linux/overflow.h index 659045046468f..473af79f11ccf 100644 --- a/include/linux/overflow.h +++ b/include/linux/overflow.h @@ -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. * @p: Pointer to the structure. * @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 - * array of @n @member elements. + * array of @count @member elements. * * Return: number of bytes needed or SIZE_MAX on overflow. */ -#define struct_size(p, member, n) \ - __ab_c_size(n, \ +#define struct_size(p, member, count) \ + __ab_c_size(count, \ sizeof(*(p)->member) + __must_be_array((p)->member),\ 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 memory needed for flexible array @member of @count + * elements within 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[0]) + __must_be_array((p)->member)) + #endif /* __LINUX_OVERFLOW_H */ -- 2.27.0
| |