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.
Acked-by: Gustavo A. R. Silva <gustavo...@kernel.org> Signed-off-by: Kees Cook <k...@kernel.org> --- Cc: "David S. Miller" <da...@davemloft.net> Cc: Eric Dumazet <eduma...@google.com> Cc: Jakub Kicinski <k...@kernel.org> Cc: Paolo Abeni <pab...@redhat.com> Cc: Simon Horman <ho...@kernel.org> Cc: Andrew Lunn <andrew+net...@lunn.ch> Cc: Stanislav Fomichev <s...@fomichev.me> Cc: Cosmin Ratiu <cra...@nvidia.com> Cc: Lei Yang <leiy...@redhat.com> Cc: Kuniyuki Iwashima <kun...@amazon.com> Cc: Ido Schimmel <ido...@nvidia.com> Cc: <net...@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); -- 2.34.1