• Gustavo A. R. Silva's avatar
    net/ipv4/ipv6: Replace one-element arraya with flexible-array members · db243b79
    Gustavo A. R. Silva authored
    There is a regular need in the kernel to provide a way to declare having
    a dynamically sized set of trailing elements in a structure. Kernel code
    should always use “flexible array members”[1] for these cases. The older
    style of one-element or zero-length arrays should no longer be used[2].
    
    Use an anonymous union with a couple of anonymous structs in order to
    keep userspace unchanged and refactor the related code accordingly:
    
    $ pahole -C group_filter net/ipv4/ip_sockglue.o
    struct group_filter {
    	union {
    		struct {
    			__u32      gf_interface_aux;     /*     0     4 */
    
    			/* XXX 4 bytes hole, try to pack */
    
    			struct __kernel_sockaddr_storage gf_group_aux; /*     8   128 */
    			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
    			__u32      gf_fmode_aux;         /*   136     4 */
    			__u32      gf_numsrc_aux;        /*   140     4 */
    			struct __kernel_sockaddr_storage gf_slist[1]; /*   144   128 */
    		};                                       /*     0   272 */
    		struct {
    			__u32      gf_interface;         /*     0     4 */
    
    			/* XXX 4 bytes hole, try to pack */
    
    			struct __kernel_sockaddr_storage gf_group; /*     8   128 */
    			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
    			__u32      gf_fmode;             /*   136     4 */
    			__u32      gf_numsrc;            /*   140     4 */
    			struct __kernel_sockaddr_storage gf_slist_flex[0]; /*   144     0 */
    		};                                       /*     0   144 */
    	};                                               /*     0   272 */
    
    	/* size: 272, cachelines: 5, members: 1 */
    	/* last cacheline: 16 bytes */
    };
    
    $ pahole -C compat_group_filter net/ipv4/ip_sockglue.o
    struct compat_group_filter {
    	union {
    		struct {
    			__u32      gf_interface_aux;     /*     0     4 */
    			struct __kernel_sockaddr_storage gf_group_aux __attribute__((__aligned__(4))); /*     4   128 */
    			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
    			__u32      gf_fmode_aux;         /*   132     4 */
    			__u32      gf_numsrc_aux;        /*   136     4 */
    			struct __kernel_sockaddr_storage gf_slist[1] __attribute__((__aligned__(4))); /*   140   128 */
    		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   268 */
    		struct {
    			__u32      gf_interface;         /*     0     4 */
    			struct __kernel_sockaddr_storage gf_group __attribute__((__aligned__(4))); /*     4   128 */
    			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
    			__u32      gf_fmode;             /*   132     4 */
    			__u32      gf_numsrc;            /*   136     4 */
    			struct __kernel_sockaddr_storage gf_slist_flex[0] __attribute__((__aligned__(4))); /*   140     0 */
    		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   140 */
    	} __attribute__((__aligned__(1)));               /*     0   268 */
    
    	/* size: 268, cachelines: 5, members: 1 */
    	/* forced alignments: 1 */
    	/* last cacheline: 12 bytes */
    } __attribute__((__packed__));
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    [1] https://en.wikipedia.org/wiki/Flexible_array_member
    [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
    
    Link: https://github.com/KSPP/linux/issues/79
    Link: https://github.com/KSPP/linux/issues/109Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    db243b79
ip_sockglue.c 41 KB