From: "Gustavo A. R. Silva" <gustavo...@kernel.org> Date: Tue, 15 Oct 2024 18:32:43 -0600 > -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/if_arp.h:118: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/if_arp.h:119: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/if_arp.h:121: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/if_arp.h:126: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/if_arp.h:127: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. > > No binary differences are present after these changes. > > Signed-off-by: Gustavo A. R. Silva <gustavo...@kernel.org> > --- > include/uapi/linux/if_arp.h | 18 +++++++++--------- > net/ipv4/arp.c | 2 +- > 2 files changed, 10 insertions(+), 10 deletions(-) > > diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h > index 4783af9fe520..cb6813f7783a 100644 > --- a/include/uapi/linux/if_arp.h > +++ b/include/uapi/linux/if_arp.h > @@ -115,18 +115,18 @@ > > /* ARP ioctl request. */ > struct arpreq { > - struct sockaddr arp_pa; /* protocol address */ > - struct sockaddr arp_ha; /* hardware address */ > - int arp_flags; /* flags */ > - struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ > - char arp_dev[IFNAMSIZ]; > + struct sockaddr_legacy arp_pa; /* protocol address > */ > + struct sockaddr_legacy arp_ha; /* hardware address > */ > + int arp_flags; /* flags > */ > + struct sockaddr_legacy arp_netmask; /* netmask (only for proxy > arps) */ > + char arp_dev[IFNAMSIZ]; > }; > > struct arpreq_old { > - struct sockaddr arp_pa; /* protocol address */ > - struct sockaddr arp_ha; /* hardware address */ > - int arp_flags; /* flags */ > - struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ > + struct sockaddr_legacy arp_pa; /* protocol address > */ > + struct sockaddr_legacy arp_ha; /* hardware address > */ > + int arp_flags; /* flags > */ > + struct sockaddr arp_netmask; /* netmask (only for proxy > arps) */
I think we can use _legacy here too, 14 bytes are enough for ARP. But whichever is fine to me because arpreq_old is not used in kernel, so Reviewed-by: Kuniyuki Iwashima <kun...@amazon.com> > }; > > /* ARP Flag values. */ > diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c > index 11c1519b3699..3a97efe1587b 100644 > --- a/net/ipv4/arp.c > +++ b/net/ipv4/arp.c > @@ -1185,7 +1185,7 @@ static int arp_req_get(struct net *net, struct arpreq > *r) > > read_lock_bh(&neigh->lock); > memcpy(r->arp_ha.sa_data, neigh->ha, > - min(dev->addr_len, sizeof(r->arp_ha.sa_data_min))); > + min(dev->addr_len, sizeof(r->arp_ha.sa_data))); > r->arp_flags = arp_state_to_flags(neigh); > read_unlock_bh(&neigh->lock); > > -- > 2.34.1