ipv4/inet_sock.h: Avoid thousands of -Wflex-array-member-not-at-end warnings
Subsystems (4)
PATCH v2 1/1 ipv4/inet_sock.h: Avoid thousands of -Wflex-array-member-not-at-end warnings
Use DEFINE_RAW_FLEX() to avoid thousands of -Wflex-array-member-not-at-end warnings.
Remove struct ip_options_data, and adjust the rest of the code so that flexible-array member struct ip_options_rcu::opt.__data[] ends last in struct icmp_bxm.
Compensate for this by using the DEFINE_RAW_FLEX() helper to define each on-stack struct instance that contained struct ip_options_data as a member, and to define struct ip_options_rcu with a fixed on-stack size for its nested flexible-array member opt.__data[].
Also, add a couple of code comments to prevent people from adding members to a struct after another member that contains a flexible array.
With these changes, fix 2600 warnings of the following type:
include/net/inet_sock.h:65:33: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
---
Changes in v2:
- Use the DEFINE_RAW_FLEX() helper.
- Update subject and changelog text.
include/net/inet_sock.h | 9 ++-- net/ipv4/icmp.c | 108 +++++++++++++++++++++------------------- net/ipv4/ip_output.c | 13 ++--- net/ipv4/ping.c | 7 +-- net/ipv4/raw.c | 7 +-- net/ipv4/udp.c | 7 +-- 6 files changed, 81 insertions(+), 70 deletions(-)
include/net/inet_sock.h +4 -5
@@ -26,6 +26,8 @@#include <net/tcp_states.h> #include <net/l3mdev.h> +#define IP_OPTIONS_DATA_FIXED_SIZE 40 +/** struct ip_options - IP Options * * @faddr - Saved first hop address
@@ -58,12 +60,9 @@ struct ip_options {struct ip_options_rcu {struct rcu_head rcu; -struct ip_options opt; -}; -struct ip_options_data { -struct ip_options_rcu opt; -char data[40 ]; +/* Must be last as it ends in a flexible-array member. */ +struct ip_options opt; };struct inet_request_sock {
net/ipv4/icmp.c +58 -50
216 lines not on this page · raw message
net/ipv4/ip_output.c +7 -6
@@ -1606,7 +1606,8 @@ void ip_send_unicast_reply(struct sock *sk, const struct sock *orig_sk,const struct ip_reply_arg *arg, unsigned int len, u64 transmit_time, u32 txhash) { - struct ip_options_data replyopts; + DEFINE_RAW_FLEX(struct ip_options_rcu, replyopts, opt.__data, +IP_OPTIONS_DATA_FIXED_SIZE );struct ipcm_cookie ipc;struct flowi4 fl4;struct rtable *rt =skb_rtable (skb);
@@ -1615,18 +1616,18 @@ void ip_send_unicast_reply(struct sock *sk, const struct sock *orig_sk,int err;int oif; -if (__ip_options_echo (net, &replyopts.opt.opt, skb, sopt)) +if (__ip_options_echo (net, &replyopts->opt, skb, sopt))return ;ipcm_init (&ipc); ipc.addr = daddr; ipc.sockc.transmit_time = transmit_time; -if (replyopts.opt.opt.optlen) { - ipc.opt = &replyopts.opt; +if (replyopts->opt.optlen) { + ipc.opt = replyopts; -if (replyopts.opt.opt.srr) - daddr = replyopts.opt.opt.faddr; +if (replyopts->opt.srr) + daddr = replyopts->opt.faddr; } oif = arg->bound_dev_if;
net/ipv4/ping.c +4 -3
@@ -690,6 +690,8 @@ EXPORT_IPV6_MOD_GPL(ping_common_sendmsg);static int ping_v4_sendmsg (struct sock *sk,struct msghdr *msg,size_t len) { + DEFINE_RAW_FLEX(struct ip_options_rcu, opt_copy, opt.__data, + IP_OPTIONS_DATA_FIXED_SIZE);struct net *net =sock_net (sk);struct flowi4 fl4;struct inet_sock *inet =inet_sk (sk);
@@ -697,7 +699,6 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)struct icmphdr user_icmph;struct pingfakehdr pfh;struct rtable *rt =NULL ; -struct ip_options_data opt_copy;int free =0 ;__be32 saddr, daddr, faddr;u8 scope;
@@ -746,9 +747,9 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)rcu_read_lock (); inet_opt =rcu_dereference (inet->inet_opt);if (inet_opt) { -memcpy (&opt_copy, inet_opt, +memcpy (opt_copy, inet_opt,sizeof (*inet_opt) + inet_opt->opt.optlen); - ipc.opt = &opt_copy.opt; + ipc.opt = opt_copy; }rcu_read_unlock (); }
net/ipv4/raw.c +4 -3
@@ -481,6 +481,8 @@ static int raw_getfrag(void *from, char *to, int offset, int len, int odd,static int raw_sendmsg (struct sock *sk,struct msghdr *msg,size_t len) { + DEFINE_RAW_FLEX(struct ip_options_rcu, opt_copy, opt.__data, + IP_OPTIONS_DATA_FIXED_SIZE);struct inet_sock *inet =inet_sk (sk);struct net *net =sock_net (sk);struct ipcm_cookie ipc;
@@ -491,7 +493,6 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)__be32 daddr;__be32 saddr;int uc_index, err; -struct ip_options_data opt_copy;struct raw_frag_vec rfv;int hdrincl;
@@ -561,9 +562,9 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)rcu_read_lock (); inet_opt =rcu_dereference (inet->inet_opt);if (inet_opt) { -memcpy (&opt_copy, inet_opt, +memcpy (opt_copy, inet_opt,sizeof (*inet_opt) + inet_opt->opt.optlen); - ipc.opt = &opt_copy.opt; + ipc.opt = opt_copy; }rcu_read_unlock (); }
net/ipv4/udp.c +4 -3
@@ -1269,6 +1269,8 @@ EXPORT_IPV6_MOD_GPL(udp_cmsg_send);int udp_sendmsg (struct sock *sk,struct msghdr *msg,size_t len) { + DEFINE_RAW_FLEX(struct ip_options_rcu, opt_copy, opt.__data, + IP_OPTIONS_DATA_FIXED_SIZE);struct inet_sock *inet =inet_sk (sk);struct udp_sock *up =udp_sk (sk); DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);
@@ -1286,7 +1288,6 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)int corkreq =udp_test_bit (CORK , sk) || msg->msg_flags &MSG_MORE ;int (*getfrag)(void *,char *,int ,int ,int ,struct sk_buff *);struct sk_buff *skb; -struct ip_options_data opt_copy;int uc_index;if (len >0xFFFF )
@@ -1368,9 +1369,9 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)rcu_read_lock (); inet_opt =rcu_dereference (inet->inet_opt);if (inet_opt) { -memcpy (&opt_copy, inet_opt, +memcpy (opt_copy, inet_opt,sizeof (*inet_opt) + inet_opt->opt.optlen); - ipc.opt = &opt_copy.opt; + ipc.opt = opt_copy; }rcu_read_unlock (); }
Signature · 1 line
2.43.0
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 8 lines · On Mon, 5 Jan 2026 15:45:25 +0900 you wrote:
Use
DEFINE_RAW_FLEX()to avoid thousands of -Wflex-array-member-not-at-end warnings.Remove struct
ip_options_data, and adjust the rest of the code so that flexible-array member struct ip_options_rcu::opt.__data[] ends last in structicmp_bxm.[...]
Here is the summary with links:
- [v2,next] ipv4/inet_sock.h: Avoid thousands of -Wflex-array-member-not-at-end warnings
https://git.kernel.org/netdev/net-next/c/c86af46b9c7a
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html