Skip to content

Commit 190faec

Browse files
GustavoARSilvakees
authored andcommitted
overflow: Add STACK_FLEX_ARRAY_SIZE() helper
Add new STACK_FLEX_ARRAY_SIZE() helper to get the size of a flexible-array member defined using DEFINE_FLEX()/DEFINE_RAW_FLEX() at compile time. This is essentially the same as ARRAY_SIZE() but for on-stack flexible-array members. Signed-off-by: Gustavo A. R. Silva <[email protected]> Link: https://lore.kernel.org/r/83d53744e11c80eb3f03765238cbe648855f4168.1745355442.git.gustavoars@kernel.org Signed-off-by: Kees Cook <[email protected]>
1 parent ccf1d2b commit 190faec

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

include/linux/overflow.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,8 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
420420
* flexible array member.
421421
* Use __struct_size(@name) to get compile-time size of it afterwards.
422422
* Use __member_size(@name->member) to get compile-time size of @name members.
423+
* Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
424+
* elements in array @member.
423425
*/
424426
#define DEFINE_RAW_FLEX(type, name, member, count) \
425427
_DEFINE_FLEX(type, name, member, count, = {})
@@ -438,8 +440,21 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
438440
* flexible array member.
439441
* Use __struct_size(@NAME) to get compile-time size of it afterwards.
440442
* Use __member_size(@NAME->member) to get compile-time size of @NAME members.
443+
* Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
444+
* elements in array @member.
441445
*/
442446
#define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT) \
443447
_DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .obj.COUNTER = COUNT, })
444448

449+
/**
450+
* STACK_FLEX_ARRAY_SIZE() - helper macro for DEFINE_FLEX() family.
451+
* Returns the number of elements in @array.
452+
*
453+
* @name: Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX().
454+
* @array: Name of the array member.
455+
*/
456+
#define STACK_FLEX_ARRAY_SIZE(name, array) \
457+
(__member_size((name)->array) / sizeof(*(name)->array) + \
458+
__must_be_array((name)->array))
459+
445460
#endif /* __LINUX_OVERFLOW_H */

0 commit comments

Comments
 (0)