-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 __kernel_sockaddr_legacy` in 
UAPI, and `struct sockaddr_legacy` for the rest of the kernel code.

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 <gustavo...@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..43fd79f90a47 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 __kernel_sockaddr_legacy rt_dst;         /* target address       
        */
+       struct __kernel_sockaddr_legacy rt_gateway;     /* gateway addr 
(RTF_GATEWAY)   */
+       struct __kernel_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 8095e82de808..3beb52261b4b 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -1019,7 +1019,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 53bd26315df5..88c7a79946f2 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


Reply via email to