Message ID | 20250520223108.2672023-2-kees@kernel.org |
---|---|
State | New |
Headers | show |
Series | net: Convert dev_set_mac_address() to struct sockaddr_storage | expand |
On 20/05/25 16:31, Kees Cook wrote: > In order to avoid passing around struct sockaddr that has a size the > compiler cannot reason about (nor track at runtime), convert > netif_set_mac_address() to take struct sockaddr_storage. This is just a > cast conversion, so there is are no binary changes. Following patches > will make actual allocation changes. > > Signed-off-by: Kees Cook <kees@kernel.org> Acked-by: Gustavo A. R. Silva <gustavoars@kernel.org> Thanks! -Gustavo > --- > Cc: "David S. Miller" <davem@davemloft.net> > Cc: Eric Dumazet <edumazet@google.com> > Cc: Jakub Kicinski <kuba@kernel.org> > Cc: Paolo Abeni <pabeni@redhat.com> > Cc: Simon Horman <horms@kernel.org> > Cc: Andrew Lunn <andrew+netdev@lunn.ch> > Cc: Stanislav Fomichev <sdf@fomichev.me> > Cc: Cosmin Ratiu <cratiu@nvidia.com> > Cc: Lei Yang <leiyang@redhat.com> > Cc: Kuniyuki Iwashima <kuniyu@amazon.com> > Cc: Ido Schimmel <idosch@nvidia.com> > Cc: <netdev@vger.kernel.org> > --- > include/linux/netdevice.h | 2 +- > net/core/dev.c | 10 +++++----- > net/core/dev_api.c | 4 ++-- > net/core/rtnetlink.c | 2 +- > 4 files changed, 9 insertions(+), 9 deletions(-) > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index ea9d335de130..47200a394a02 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -4212,7 +4212,7 @@ int netif_set_mtu(struct net_device *dev, int new_mtu); > int dev_set_mtu(struct net_device *, int); > int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, > struct netlink_ext_ack *extack); > -int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, > +int netif_set_mac_address(struct net_device *dev, struct sockaddr_storage *ss, > struct netlink_ext_ack *extack); > int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, > struct netlink_ext_ack *extack); > diff --git a/net/core/dev.c b/net/core/dev.c > index fccf2167b235..f8c8aad7df2e 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -9655,7 +9655,7 @@ int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, > } > EXPORT_SYMBOL(dev_pre_changeaddr_notify); > > -int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, > +int netif_set_mac_address(struct net_device *dev, struct sockaddr_storage *ss, > struct netlink_ext_ack *extack) > { > const struct net_device_ops *ops = dev->netdev_ops; > @@ -9663,15 +9663,15 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, > > if (!ops->ndo_set_mac_address) > return -EOPNOTSUPP; > - if (sa->sa_family != dev->type) > + if (ss->ss_family != dev->type) > return -EINVAL; > if (!netif_device_present(dev)) > return -ENODEV; > - err = dev_pre_changeaddr_notify(dev, sa->sa_data, extack); > + err = dev_pre_changeaddr_notify(dev, ss->__data, extack); > if (err) > return err; > - if (memcmp(dev->dev_addr, sa->sa_data, dev->addr_len)) { > - err = ops->ndo_set_mac_address(dev, sa); > + if (memcmp(dev->dev_addr, ss->__data, dev->addr_len)) { > + err = ops->ndo_set_mac_address(dev, ss); > if (err) > return err; > } > diff --git a/net/core/dev_api.c b/net/core/dev_api.c > index f9a160ab596f..b5f293e637d9 100644 > --- a/net/core/dev_api.c > +++ b/net/core/dev_api.c > @@ -91,7 +91,7 @@ int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa, > > down_write(&dev_addr_sem); > netdev_lock_ops(dev); > - ret = netif_set_mac_address(dev, sa, extack); > + ret = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); > netdev_unlock_ops(dev); > up_write(&dev_addr_sem); > > @@ -332,7 +332,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, > int ret; > > netdev_lock_ops(dev); > - ret = netif_set_mac_address(dev, sa, extack); > + ret = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); > netdev_unlock_ops(dev); > > return ret; > diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c > index 8a914b37ef6e..9743f1c2ae3c 100644 > --- a/net/core/rtnetlink.c > +++ b/net/core/rtnetlink.c > @@ -3100,7 +3100,7 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev, > > memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), > dev->addr_len); > - err = netif_set_mac_address(dev, sa, extack); > + err = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); > kfree(sa); > if (err) { > up_write(&dev_addr_sem);
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ea9d335de130..47200a394a02 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4212,7 +4212,7 @@ int netif_set_mtu(struct net_device *dev, int new_mtu); int dev_set_mtu(struct net_device *, int); int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, struct netlink_ext_ack *extack); -int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, +int netif_set_mac_address(struct net_device *dev, struct sockaddr_storage *ss, struct netlink_ext_ack *extack); int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, struct netlink_ext_ack *extack); diff --git a/net/core/dev.c b/net/core/dev.c index fccf2167b235..f8c8aad7df2e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9655,7 +9655,7 @@ int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, } EXPORT_SYMBOL(dev_pre_changeaddr_notify); -int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, +int netif_set_mac_address(struct net_device *dev, struct sockaddr_storage *ss, struct netlink_ext_ack *extack) { const struct net_device_ops *ops = dev->netdev_ops; @@ -9663,15 +9663,15 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa, if (!ops->ndo_set_mac_address) return -EOPNOTSUPP; - if (sa->sa_family != dev->type) + if (ss->ss_family != dev->type) return -EINVAL; if (!netif_device_present(dev)) return -ENODEV; - err = dev_pre_changeaddr_notify(dev, sa->sa_data, extack); + err = dev_pre_changeaddr_notify(dev, ss->__data, extack); if (err) return err; - if (memcmp(dev->dev_addr, sa->sa_data, dev->addr_len)) { - err = ops->ndo_set_mac_address(dev, sa); + if (memcmp(dev->dev_addr, ss->__data, dev->addr_len)) { + err = ops->ndo_set_mac_address(dev, ss); if (err) return err; } diff --git a/net/core/dev_api.c b/net/core/dev_api.c index f9a160ab596f..b5f293e637d9 100644 --- a/net/core/dev_api.c +++ b/net/core/dev_api.c @@ -91,7 +91,7 @@ int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa, down_write(&dev_addr_sem); netdev_lock_ops(dev); - ret = netif_set_mac_address(dev, sa, extack); + ret = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); netdev_unlock_ops(dev); up_write(&dev_addr_sem); @@ -332,7 +332,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa, int ret; netdev_lock_ops(dev); - ret = netif_set_mac_address(dev, sa, extack); + ret = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); netdev_unlock_ops(dev); return ret; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 8a914b37ef6e..9743f1c2ae3c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -3100,7 +3100,7 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev, memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]), dev->addr_len); - err = netif_set_mac_address(dev, sa, extack); + err = netif_set_mac_address(dev, (struct sockaddr_storage *)sa, extack); kfree(sa); if (err) { up_write(&dev_addr_sem);
In order to avoid passing around struct sockaddr that has a size the compiler cannot reason about (nor track at runtime), convert netif_set_mac_address() to take struct sockaddr_storage. This is just a cast conversion, so there is are no binary changes. Following patches will make actual allocation changes. Signed-off-by: Kees Cook <kees@kernel.org> --- Cc: "David S. Miller" <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Paolo Abeni <pabeni@redhat.com> Cc: Simon Horman <horms@kernel.org> Cc: Andrew Lunn <andrew+netdev@lunn.ch> Cc: Stanislav Fomichev <sdf@fomichev.me> Cc: Cosmin Ratiu <cratiu@nvidia.com> Cc: Lei Yang <leiyang@redhat.com> Cc: Kuniyuki Iwashima <kuniyu@amazon.com> Cc: Ido Schimmel <idosch@nvidia.com> Cc: <netdev@vger.kernel.org> --- include/linux/netdevice.h | 2 +- net/core/dev.c | 10 +++++----- net/core/dev_api.c | 4 ++-- net/core/rtnetlink.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-)