Skip to content
  • Qian Cai's avatar
    5e5412c3
    net/socket: fix GCC8+ Wpacked-not-aligned warnings · 5e5412c3
    Qian Cai authored
    
    
    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 20c9c825 ("[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.
    
    Suggested-by: default avatarDavid Laight <David.Laight@ACULAB.COM>
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5e5412c3
    net/socket: fix GCC8+ Wpacked-not-aligned warnings
    Qian Cai authored
    
    
    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 20c9c825 ("[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.
    
    Suggested-by: default avatarDavid Laight <David.Laight@ACULAB.COM>
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Loading