On Thu, Oct 24, 2024 at 03:11:24PM -0600, Gustavo A. R. Silva wrote: > diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h > index d3fcd3b5ec53..2e179706bec4 100644 > --- a/include/uapi/linux/socket.h > +++ b/include/uapi/linux/socket.h > @@ -35,4 +35,32 @@ struct __kernel_sockaddr_storage { > #define SOCK_TXREHASH_DISABLED 0 > #define SOCK_TXREHASH_ENABLED 1 > > +typedef __kernel_sa_family_t sa_family_t; > + > +/* > + * This is the legacy form of `struct sockaddr`. The original `struct > sockaddr` > + * was modified in commit b5f0de6df6dce ("net: dev: Convert sa_data to > flexible > + * array in struct sockaddr") due to the fact that "One of the worst > offenders > + * of "fake flexible arrays" is struct sockaddr". This means that the > original > + * `char sa_data[14]` behaved as a flexible array at runtime, so a proper > + * flexible-array member was introduced. > + * > + * This caused several flexible-array-in-the-middle issues: > + * > https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wflex-array-member-not-at-end > + * > + * `struct sockaddr_legacy` replaces `struct sockaddr` in all instances where > + * objects of this type do not appear at the end of composite structures. > + */ > +struct sockaddr_legacy { > + sa_family_t sa_family; /* address family, AF_xxx */ > + char sa_data[14]; /* 14 bytes of protocol address */ > +}; > + > +#ifdef __KERNEL__ > +# define __kernel_sockaddr_legacy sockaddr_legacy > +#else > +# define __kernel_sockaddr_legacy sockaddr > +#endif
Yeah, this matches what I'd expect. Reviewed-by: Kees Cook <k...@kernel.org> -- Kees Cook