There are a lot of those warnings with GCC8+ 64-bit, In file included from ./include/linux/sctp.h:42, from net/core/skbuff.c:47: ./include/uapi/linux/sctp.h:395:1: warning: alignment 4 of 'struct sctp_paddr_change' is less than 8 [-Wpacked-not-aligned] } __attribute__((packed, aligned(4))); ^ ./include/uapi/linux/sctp.h:728:1: warning: alignment 4 of 'struct sctp_setpeerprim' is less than 8 [-Wpacked-not-aligned] } __attribute__((packed, aligned(4))); ^ ./include/uapi/linux/sctp.h:727:26: warning: 'sspp_addr' offset 4 in 'struct sctp_setpeerprim' isn't aligned to 8 [-Wpacked-not-aligned] struct sockaddr_storage sspp_addr; ^~~~~~~~~ ./include/uapi/linux/sctp.h:741:1: warning: alignment 4 of 'struct sctp_prim' is less than 8 [-Wpacked-not-aligned] } __attribute__((packed, aligned(4))); ^ ./include/uapi/linux/sctp.h:740:26: warning: 'ssp_addr' offset 4 in 'struct sctp_prim' isn't aligned to 8 [-Wpacked-not-aligned] struct sockaddr_storage ssp_addr; ^~~~~~~~ ./include/uapi/linux/sctp.h:792:1: warning: alignment 4 of 'struct sctp_paddrparams' is less than 8 [-Wpacked-not-aligned] } __attribute__((packed, aligned(4))); ^ ./include/uapi/linux/sctp.h:784:26: warning: 'spp_address' offset 4 in 'struct sctp_paddrparams' isn't aligned to 8 [-Wpacked-not-aligned] struct sockaddr_storage spp_address; ^~~~~~~~~~~ ./include/uapi/linux/sctp.h:905:1: warning: alignment 4 of 'struct sctp_paddrinfo' is less than 8 [-Wpacked-not-aligned] } __attribute__((packed, aligned(4))); ^ ./include/uapi/linux/sctp.h:899:26: warning: 'spinfo_address' offset 4 in 'struct sctp_paddrinfo' isn't aligned to 8 [-Wpacked-not-aligned] struct sockaddr_storage spinfo_address; ^~~~~~~~~~~~~~ This is because the commit 20c9c825b12f ("[SCTP] Fix SCTP socket options to work with 32-bit apps on 64-bit kernels.") added "packed, aligned(4)" GCC attributes to some structures but one of the members, i.e, "struct sockaddr_storage" in those structures has the attribute, "aligned(__alignof__ (struct sockaddr *)" which is 8-byte on 64-bit systems, so the commit overwrites the designed alignments for "sockaddr_storage". To fix this, "struct sockaddr_storage" needs to be aligned to 4-byte as it is only used in those packed sctp structure which is part of UAPI, and "struct __kernel_sockaddr_storage" is used in some other places of UAPI that need not to change alignments in order to not breaking userspace. Use an implicit alignment for "struct __kernel_sockaddr_storage" so it can keep the same alignments as a member in both packed and un-packed structures without breaking UAPI.
Showing the changes to include/uapi/linux (1 of 1 file). Show all
Unified · Split
| @@ -6,17 +6,24 @@ · 5 unmodified lines | ||
| 6 | 6 | * Desired design of maximum size and alignment (see RFC2553) |
| 7 | 7 | */ |
| 8 | 8 | #define _K_SS_MAXSIZE 128 /* Implementation specific max size */ |
| 9 | −#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *)) | |
| 10 | − /* Implementation specific desired alignment */ | |
| 11 | 9 | |
| 12 | 10 | typedef unsigned short __kernel_sa_family_t; |
| 13 | 11 | |
| 12 | +/* | |
| 13 | + * The definition uses anonymous union and struct in order to control the | |
| 14 | + * default alignment. | |
| 15 | + */ | |
| 14 | 16 | struct __kernel_sockaddr_storage { |
| 15 | − __kernel_sa_family_t ss_family; /* address family */ | |
| 16 | − /* Following field(s) are implementation specific */ | |
| 17 | − char __data[_K_SS_MAXSIZE - sizeof(unsigned short)]; | |
| 17 | + union { | |
| 18 | + struct { | |
| 19 | + __kernel_sa_family_t ss_family; /* address family */ | |
| 20 | + /* Following field(s) are implementation specific */ | |
| 21 | + char __data[_K_SS_MAXSIZE - sizeof(unsigned short)]; | |
| 18 | 22 | /* space to achieve desired size, */ |
| 19 | 23 | /* _SS_MAXSIZE value minus size of ss_family */ |
| 20 | −} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ | |
| 24 | + }; | |
| 25 | + void *__align; /* implementation specific desired alignment */ | |
| 26 | + }; | |
| 27 | +}; | |
| 21 | 28 | |
| 22 | 29 | #endif /* _UAPI_LINUX_SOCKET_H */ |