On Mon, Mar 18, 2024 at 05:00:33PM -0600, Gustavo A. R. Silva wrote: > We need a new `struct_group()` helper that allows for both having the > struct be tagged, and specifying struct attributes like `__packed` > or `__align(x)`. > > This new helper will initially be used to address > -Wflex-array-member-not-at-end warnings, where a tagged struct is used > to separate the flexible-array member from the rest of the members in > the flexible structure [1]. There are some scenarios in which those > members need to be packed, as well. > > So, `struct_group_tagged_attr()` is introduced for this. > > Link: https://lore.kernel.org/linux-hardening/ZeIgeZ5Sb0IZTOyt@neat/ [1] > Signed-off-by: Gustavo A. R. Silva <[email protected]> > --- > include/linux/stddef.h | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/include/linux/stddef.h b/include/linux/stddef.h > index 929d67710cc5..919df9453257 100644 > --- a/include/linux/stddef.h > +++ b/include/linux/stddef.h > @@ -80,6 +80,26 @@ enum { > #define struct_group_tagged(TAG, NAME, MEMBERS...) \ > __struct_group(TAG, NAME, /* no attrs */, MEMBERS) > > +/** > + * struct_group_tagged_attr() - Create a struct_group with a reusable > + * tag and trailing attributes. > + * > + * @TAG: The tag name for the named sub-struct > + * @NAME: The identifier name of the mirrored sub-struct > + * @ATTRS: Any struct attributes to apply > + * @MEMBERS: The member declarations for the mirrored structs > + * > + * Used to create an anonymous union of two structs with identical > + * layout and size: one anonymous and one named. The former can be > + * used normally without sub-struct naming, and the latter can be > + * used to reason about the start, end, and size of the group of > + * struct members. Includes struct tag argument for the named copy, > + * so the specified layout can be reused later. Also includes > + * structure attributes argument. > + */ > +#define struct_group_tagged_attr(TAG, NAME, ATTRS, MEMBERS...) \ > + __struct_group(TAG, NAME, ATTRS, MEMBERS)
This is the same as __struct_group() only with a longer name? Why not just use __struct_group() directly? -- Kees Cook
