Gustavo A. R. Silva
db243b7964
net/ipv4/ipv6: Replace one-element arraya with flexible-array members
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/109
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-08-05 11:46:42 +01:00
..
2020-11-19 17:21:34 +01:00
2021-06-26 07:12:44 +02:00
2021-07-01 13:19:48 -07:00
2021-01-28 20:36:21 -08:00
2021-07-02 02:07:01 +02:00
2021-07-29 15:06:50 +01:00
2021-08-02 15:11:37 +01:00
2021-07-25 23:06:02 +01:00
2021-06-01 16:54:42 -07:00
2020-02-28 14:51:30 +01:00
2021-08-02 10:24:38 +01:00
2021-04-27 14:02:06 -07:00
2021-04-23 10:17:26 +01:00
2021-08-04 09:55:52 +01:00
2021-06-11 13:32:46 -07:00
2019-11-06 16:14:48 -08:00
2021-08-03 13:05:25 +01:00
2020-07-21 18:30:47 -07:00
2021-08-03 11:50:22 +01:00
2020-05-01 12:15:37 -07:00
2021-08-03 11:50:22 +01:00
2021-08-03 11:50:22 +01:00
2021-03-26 17:43:55 +01:00
2021-07-01 11:23:50 -07:00
2021-06-28 13:06:12 -07:00
2020-02-29 14:39:08 +01:00
2021-06-10 11:45:14 -04:00
2020-07-15 07:45:24 -07:00
2020-03-27 19:40:38 -07:00
2021-08-05 11:46:42 +01:00
2021-07-30 13:16:38 -07:00
2021-07-30 15:33:24 +02:00
2021-08-02 15:13:15 +01:00
2019-12-16 16:09:44 -08:00
2021-07-09 13:55:53 -07:00
2020-05-08 21:33:33 -07:00
2021-07-29 12:18:11 +01:00
2020-05-05 13:23:29 -07:00
2020-02-19 13:52:32 +01:00
2020-04-20 07:34:16 +02:00
2019-12-24 22:37:30 -08:00
2020-07-28 17:42:31 -07:00
2021-03-14 14:46:32 -07:00
2021-06-28 14:24:06 -07:00
2021-04-19 12:25:11 +02:00
2021-01-21 13:33:45 +01:00
2021-01-21 13:33:45 +01:00
2019-12-09 10:36:44 -08:00
2019-11-05 18:20:55 -08:00
2021-02-12 16:31:46 -08:00
2021-01-29 20:39:14 -08:00
2021-03-18 19:51:12 -07:00
2020-06-22 21:12:44 -07:00
2019-10-25 16:24:32 -07:00
2021-06-28 14:29:45 -07:00
2020-11-06 11:01:01 +01:00
2021-03-26 15:14:56 -07:00
2020-03-30 13:45:04 -07:00
2021-01-27 18:18:15 -08:00
2021-06-29 11:54:36 -07:00
2020-12-14 18:38:58 -08:00
2020-12-12 15:08:54 -08:00
2021-07-23 16:44:57 -07:00
2020-08-26 07:33:19 -07:00
2021-07-21 08:14:33 -07:00
2020-06-20 17:47:53 -07:00
2021-02-08 16:47:03 -08:00
2021-07-21 08:22:02 -07:00
2021-07-30 15:33:24 +02:00
2021-07-27 20:11:44 +01:00
2021-02-04 18:37:57 -08:00
2021-07-21 08:22:03 -07:00
2020-11-19 10:49:50 -08:00
2021-03-30 13:29:39 -07:00
2021-05-18 13:27:32 -07:00
2020-02-05 14:28:09 +01:00
2020-06-20 17:22:22 -07:00
2021-03-23 14:14:50 -07:00
2021-07-27 13:05:56 +01:00
2020-03-29 22:30:57 -07:00
2021-06-23 18:12:00 +02:00
2021-06-24 12:41:12 -07:00
2021-07-29 15:06:50 +01:00
2021-07-29 15:06:50 +01:00
2020-03-02 11:16:27 -08:00
2021-03-26 15:14:56 -07:00
2020-02-28 12:08:37 -08:00
2020-05-29 21:20:20 -07:00
2021-07-09 18:38:53 -07:00
2019-12-09 10:36:44 -08:00
2020-08-24 06:40:07 -07:00
2020-11-13 14:24:39 -08:00
2021-07-29 15:06:50 +01:00
2021-07-27 11:43:50 +01:00
2019-11-12 08:18:03 -08:00
2021-03-28 17:53:39 -07:00
2021-06-07 14:11:47 -07:00
2020-03-04 13:25:55 -08:00
2021-08-02 10:24:38 +01:00
2021-05-14 15:05:46 -07:00
2021-05-17 15:29:35 -07:00
2021-03-14 15:00:43 -07:00
2021-03-25 17:40:43 -07:00
2020-07-31 09:24:23 +02:00
2020-08-24 14:35:00 -07:00
2020-11-23 18:36:21 -05:00
2020-06-23 20:27:09 -07:00
2021-08-04 10:01:26 +01:00
2021-08-02 10:24:38 +01:00
2020-07-13 11:03:44 -07:00
2020-06-04 15:39:32 -07:00
2021-04-28 14:06:45 -07:00
2020-09-28 15:19:03 -07:00
2021-06-15 18:01:05 +02:00
2021-08-04 12:52:03 +01:00
2021-08-03 13:05:26 +01:00
2021-08-04 12:35:07 +01:00
2021-07-31 11:23:26 -07:00
2021-06-29 11:28:21 -07:00
2020-06-23 20:10:15 -07:00
2020-06-18 20:46:23 -07:00
2021-02-04 18:37:14 -08:00
2021-04-12 17:34:27 +02:00
2019-11-14 18:12:17 -08:00
2020-09-14 16:49:39 -07:00
2019-12-09 10:28:43 -08:00
2019-11-16 12:39:10 -08:00
2020-11-17 22:07:40 +01:00
2021-06-24 19:41:15 +02:00
2021-07-07 19:51:12 -07:00
2021-06-29 15:45:27 -07:00
2021-06-18 16:57:19 +02:00