From: Kees Cook Date: Wed, 21 May 2025 20:46:10 +0000 (-0700) Subject: net: core: Switch netif_set_mac_address() to struct sockaddr_storage X-Git-Tag: v6.16-rc1~132^2~28^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=161972650d6795ea00f8b72557cf3c3e593ed250;p=thirdparty%2Fkernel%2Flinux.git net: core: Switch netif_set_mac_address() to struct sockaddr_storage 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 Signed-off-by: Kees Cook Link: https://patch.msgid.link/20250521204619.2301870-2-kees@kernel.org Signed-off-by: Paolo Abeni --- diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ea9d335de130e..47200a394a02c 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 3eb4e945f3120..6a0560546eebc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9669,7 +9669,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; @@ -9677,15 +9677,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 f9a160ab596f3..b5f293e637d95 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 8a914b37ef6e8..9743f1c2ae3c3 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);