-Wflex-array-member-not-at-end was introduced in GCC-14, and we are
getting ready to enable it, globally.
Address the following warnings by changing the type of the middle struct
members in a couple of composite structs, which are currently causing
trouble, from `struct sockaddr` to `struct sockaddr_legacy`. Note that
the latter struct doesn't contain a flexible-array member.
include/uapi/linux/route.h:33:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
include/uapi/linux/route.h:34:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
include/uapi/linux/route.h:35:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end
include/net/compat.h:34:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
include/net/compat.h:35:25: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
Also, update some related code, accordingly.
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
include/net/compat.h | 30 +++++++++++++++---------------
include/uapi/linux/route.h | 28 ++++++++++++++--------------
net/appletalk/ddp.c | 2 +-
net/ipv4/af_inet.c | 2 +-
net/ipv4/fib_frontend.c | 2 +-
5 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/include/net/compat.h b/include/net/compat.h
index 84c163f40f38..89e891d8dcf3 100644
--- a/include/net/compat.h
+++ b/include/net/compat.h
@@ -29,21 +29,21 @@ struct compat_cmsghdr {
};
struct compat_rtentry {
- u32 rt_pad1;
- struct sockaddr rt_dst; /* target address */
- struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
- struct sockaddr rt_genmask; /* target network mask (IP) */
- unsigned short rt_flags;
- short rt_pad2;
- u32 rt_pad3;
- unsigned char rt_tos;
- unsigned char rt_class;
- short rt_pad4;
- short rt_metric; /* +1 for binary compatibility! */
- compat_uptr_t rt_dev; /* forcing the device at add */
- u32 rt_mtu; /* per route MTU/Window */
- u32 rt_window; /* Window clamping */
- unsigned short rt_irtt; /* Initial RTT */
+ u32 rt_pad1;
+ struct sockaddr_legacy rt_dst; /* target address */
+ struct sockaddr_legacy rt_gateway; /* gateway addr (RTF_GATEWAY) */
+ struct sockaddr_legacy rt_genmask; /* target network mask (IP) */
+ unsigned short rt_flags;
+ short rt_pad2;
+ u32 rt_pad3;
+ unsigned char rt_tos;
+ unsigned char rt_class;
+ short rt_pad4;
+ short rt_metric; /* +1 for binary compatibility! */
+ compat_uptr_t rt_dev; /* forcing the device at add */
+ u32 rt_mtu; /* per route MTU/Window */
+ u32 rt_window; /* Window clamping */
+ unsigned short rt_irtt; /* Initial RTT */
};
int __get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr *msg,
diff --git a/include/uapi/linux/route.h b/include/uapi/linux/route.h
index a0de9a7331a2..7e43765e03dd 100644
--- a/include/uapi/linux/route.h
+++ b/include/uapi/linux/route.h
@@ -29,22 +29,22 @@
/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
struct rtentry {
- unsigned long rt_pad1;
- struct sockaddr rt_dst; /* target address */
- struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
- struct sockaddr rt_genmask; /* target network mask (IP) */
- unsigned short rt_flags;
- short rt_pad2;
- unsigned long rt_pad3;
- void *rt_pad4;
- short rt_metric; /* +1 for binary compatibility! */
- char __user *rt_dev; /* forcing the device at add */
- unsigned long rt_mtu; /* per route MTU/Window */
+ unsigned long rt_pad1;
+ struct sockaddr_legacy rt_dst; /* target address */
+ struct sockaddr_legacy rt_gateway; /* gateway addr (RTF_GATEWAY) */
+ struct sockaddr_legacy rt_genmask; /* target network mask (IP) */
+ unsigned short rt_flags;
+ short rt_pad2;
+ unsigned long rt_pad3;
+ void *rt_pad4;
+ short rt_metric; /* +1 for binary compatibility! */
+ char __user *rt_dev; /* forcing the device at add */
+ unsigned long rt_mtu; /* per route MTU/Window */
#ifndef __KERNEL__
-#define rt_mss rt_mtu /* Compatibility :-( */
+#define rt_mss rt_mtu /* Compatibility :-( */
#endif
- unsigned long rt_window; /* Window clamping */
- unsigned short rt_irtt; /* Initial RTT */
+ unsigned long rt_window; /* Window clamping */
+ unsigned short rt_irtt; /* Initial RTT */
};
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index b068651984fe..aac82a4af36f 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c
@@ -1832,7 +1832,7 @@ static int atalk_compat_routing_ioctl(struct sock *sk, unsigned int cmd,
struct rtentry rt;
if (copy_from_user(&rt.rt_dst, &ur->rt_dst,
- 3 * sizeof(struct sockaddr)) ||
+ 3 * sizeof(struct sockaddr_legacy)) ||
get_user(rt.rt_flags, &ur->rt_flags) ||
get_user(rt.rt_metric, &ur->rt_metric) ||
get_user(rt.rt_mtu, &ur->rt_mtu) ||
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index b24d74616637..75bd15d884e3 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -1021,7 +1021,7 @@ static int inet_compat_routing_ioctl(struct sock *sk, unsigned int cmd,
struct rtentry rt;
if (copy_from_user(&rt.rt_dst, &ur->rt_dst,
- 3 * sizeof(struct sockaddr)) ||
+ 3 * sizeof(struct sockaddr_legacy)) ||
get_user(rt.rt_flags, &ur->rt_flags) ||
get_user(rt.rt_metric, &ur->rt_metric) ||
get_user(rt.rt_mtu, &ur->rt_mtu) ||
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 8353518b110a..595b9ac58e92 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -452,7 +452,7 @@ int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
itag);
}
-static inline __be32 sk_extract_addr(struct sockaddr *addr)
+static inline __be32 sk_extract_addr(struct sockaddr_legacy *addr)
{
return ((struct sockaddr_in *) addr)->sin_addr.s_addr;
}
--
2.34.1
From: "Gustavo A. R. Silva" <gustavoars@kernel.org> Date: Tue, 15 Oct 2024 18:33:23 -0600 > diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c > index b068651984fe..aac82a4af36f 100644 > --- a/net/appletalk/ddp.c > +++ b/net/appletalk/ddp.c > @@ -1832,7 +1832,7 @@ static int atalk_compat_routing_ioctl(struct sock *sk, unsigned int cmd, > struct rtentry rt; > > if (copy_from_user(&rt.rt_dst, &ur->rt_dst, > - 3 * sizeof(struct sockaddr)) || > + 3 * sizeof(struct sockaddr_legacy)) || While at it, please fix the indent. > get_user(rt.rt_flags, &ur->rt_flags) || > get_user(rt.rt_metric, &ur->rt_metric) || > get_user(rt.rt_mtu, &ur->rt_mtu) || > diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c > index b24d74616637..75bd15d884e3 100644 > --- a/net/ipv4/af_inet.c > +++ b/net/ipv4/af_inet.c > @@ -1021,7 +1021,7 @@ static int inet_compat_routing_ioctl(struct sock *sk, unsigned int cmd, > struct rtentry rt; > > if (copy_from_user(&rt.rt_dst, &ur->rt_dst, > - 3 * sizeof(struct sockaddr)) || > + 3 * sizeof(struct sockaddr_legacy)) || Same here. Otherwise looks good to me. Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> > get_user(rt.rt_flags, &ur->rt_flags) || > get_user(rt.rt_metric, &ur->rt_metric) || > get_user(rt.rt_mtu, &ur->rt_mtu) ||
© 2016 - 2024 Red Hat, Inc.