Commit 358bea91 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'net-convert-dev_set_mac_address-to-struct-sockaddr_storage'

Kees Cook says:

====================
net: Convert dev_set_mac_address() to struct sockaddr_storage

As part of the effort to allow the compiler to reason about object sizes,
we need to deal with the problematic variably sized struct sockaddr,
which has no internal runtime size tracking. In much of the network
stack the use of struct sockaddr_storage has been adopted. Continue the
transition toward this for more of the internal APIs. Specifically:

- inet_addr_is_any()
- netif_set_mac_address()
- dev_set_mac_address()
- dev_set_mac_address_user()

Only a few callers of dev_set_mac_address() needed adjustment; all others
were already using struct sockaddr_storage internally.

v1: https://lore.kernel.org/all/20250520222452.work.063-kees@kernel.org/
====================

Link: https://patch.msgid.link/20250521204310.it.500-kees@kernel.org


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 5bccdc51 ae9fcd5a
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -1035,7 +1035,7 @@ static int alb_set_slave_mac_addr(struct slave *slave, const u8 addr[],
	 */
	memcpy(ss.__data, addr, len);
	ss.ss_family = dev->type;
	if (dev_set_mac_address(dev, (struct sockaddr *)&ss, NULL)) {
	if (dev_set_mac_address(dev, &ss, NULL)) {
		slave_err(slave->bond->dev, dev, "dev_set_mac_address on slave failed! ALB mode requires that the base driver support setting the hw address also when the network device's interface is open\n");
		return -EOPNOTSUPP;
	}
@@ -1273,8 +1273,7 @@ static int alb_set_mac_address(struct bonding *bond, void *addr)
			break;
		bond_hw_addr_copy(tmp_addr, rollback_slave->dev->dev_addr,
				  rollback_slave->dev->addr_len);
		dev_set_mac_address(rollback_slave->dev,
				    (struct sockaddr *)&ss, NULL);
		dev_set_mac_address(rollback_slave->dev, &ss, NULL);
		dev_addr_set(rollback_slave->dev, tmp_addr);
	}

@@ -1763,8 +1762,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
				  bond->dev->addr_len);
		ss.ss_family = bond->dev->type;
		/* we don't care if it can't change its mac, best effort */
		dev_set_mac_address(new_slave->dev, (struct sockaddr *)&ss,
				    NULL);
		dev_set_mac_address(new_slave->dev, &ss, NULL);

		dev_addr_set(new_slave->dev, tmp_addr);
	}
+6 −9
Original line number Diff line number Diff line
@@ -1112,8 +1112,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
			ss.ss_family = bond->dev->type;
		}

		rv = dev_set_mac_address(new_active->dev,
					 (struct sockaddr *)&ss, NULL);
		rv = dev_set_mac_address(new_active->dev, &ss, NULL);
		if (rv) {
			slave_err(bond->dev, new_active->dev, "Error %d setting MAC of new active slave\n",
				  -rv);
@@ -1127,8 +1126,7 @@ static void bond_do_fail_over_mac(struct bonding *bond,
				  new_active->dev->addr_len);
		ss.ss_family = old_active->dev->type;

		rv = dev_set_mac_address(old_active->dev,
					 (struct sockaddr *)&ss, NULL);
		rv = dev_set_mac_address(old_active->dev, &ss, NULL);
		if (rv)
			slave_err(bond->dev, old_active->dev, "Error %d setting MAC of old active slave\n",
				  -rv);
@@ -2127,7 +2125,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
	}

	ss.ss_family = slave_dev->type;
	res = dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, extack);
	res = dev_set_mac_address(slave_dev, &ss, extack);
	if (res) {
		slave_err(bond_dev, slave_dev, "Error %d calling set_mac_address\n", res);
		goto err_restore_mtu;
@@ -2455,7 +2453,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
		bond_hw_addr_copy(ss.__data, new_slave->perm_hwaddr,
				  new_slave->dev->addr_len);
		ss.ss_family = slave_dev->type;
		dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
		dev_set_mac_address(slave_dev, &ss, NULL);
	}

err_restore_mtu:
@@ -2649,7 +2647,7 @@ static int __bond_release_one(struct net_device *bond_dev,
		bond_hw_addr_copy(ss.__data, slave->perm_hwaddr,
				  slave->dev->addr_len);
		ss.ss_family = slave_dev->type;
		dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
		dev_set_mac_address(slave_dev, &ss, NULL);
	}

	if (unregister) {
@@ -4936,8 +4934,7 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
		if (rollback_slave == slave)
			break;

		tmp_res = dev_set_mac_address(rollback_slave->dev,
					      (struct sockaddr *)&tmp_ss, NULL);
		tmp_res = dev_set_mac_address(rollback_slave->dev, &tmp_ss, NULL);
		if (tmp_res) {
			slave_dbg(bond_dev, rollback_slave->dev, "%s: unwind err %d\n",
				   __func__, tmp_res);
+3 −3
Original line number Diff line number Diff line
@@ -1371,7 +1371,7 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
	struct net_device_context *ndc = netdev_priv(ndev);
	struct net_device *vf_netdev = rtnl_dereference(ndc->vf_netdev);
	struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
	struct sockaddr *addr = p;
	struct sockaddr_storage *addr = p;
	int err;

	err = eth_prepare_mac_addr_change(ndev, p);
@@ -1387,12 +1387,12 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
			return err;
	}

	err = rndis_filter_set_device_mac(nvdev, addr->sa_data);
	err = rndis_filter_set_device_mac(nvdev, addr->__data);
	if (!err) {
		eth_commit_mac_addr_change(ndev, p);
	} else if (vf_netdev) {
		/* rollback change on VF */
		memcpy(addr->sa_data, ndev->dev_addr, ETH_ALEN);
		memcpy(addr->__data, ndev->dev_addr, ETH_ALEN);
		dev_set_mac_address(vf_netdev, addr, NULL);
	}

+9 −9
Original line number Diff line number Diff line
@@ -754,13 +754,13 @@ static int macvlan_sync_address(struct net_device *dev,
static int macvlan_set_mac_address(struct net_device *dev, void *p)
{
	struct macvlan_dev *vlan = netdev_priv(dev);
	struct sockaddr *addr = p;
	struct sockaddr_storage *addr = p;

	if (!is_valid_ether_addr(addr->sa_data))
	if (!is_valid_ether_addr(addr->__data))
		return -EADDRNOTAVAIL;

	/* If the addresses are the same, this is a no-op */
	if (ether_addr_equal(dev->dev_addr, addr->sa_data))
	if (ether_addr_equal(dev->dev_addr, addr->__data))
		return 0;

	if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
@@ -768,10 +768,10 @@ static int macvlan_set_mac_address(struct net_device *dev, void *p)
		return dev_set_mac_address(vlan->lowerdev, addr, NULL);
	}

	if (macvlan_addr_busy(vlan->port, addr->sa_data))
	if (macvlan_addr_busy(vlan->port, addr->__data))
		return -EADDRINUSE;

	return macvlan_sync_address(dev, addr->sa_data);
	return macvlan_sync_address(dev, addr->__data);
}

static void macvlan_change_rx_flags(struct net_device *dev, int change)
@@ -1295,11 +1295,11 @@ static void macvlan_port_destroy(struct net_device *dev)
	 */
	if (macvlan_passthru(port) &&
	    !ether_addr_equal(port->dev->dev_addr, port->perm_addr)) {
		struct sockaddr sa;
		struct sockaddr_storage ss;

		sa.sa_family = port->dev->type;
		memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len);
		dev_set_mac_address(port->dev, &sa, NULL);
		ss.ss_family = port->dev->type;
		memcpy(&ss.__data, port->perm_addr, port->dev->addr_len);
		dev_set_mac_address(port->dev, &ss, NULL);
	}

	kfree(port);
+9 −5
Original line number Diff line number Diff line
@@ -923,7 +923,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
	unsigned int __user *up = argp;
	unsigned short u;
	int __user *sp = argp;
	struct sockaddr sa;
	struct sockaddr_storage ss;
	int s;
	int ret;

@@ -1000,16 +1000,17 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
			return -ENOLINK;
		}
		ret = 0;
		dev_get_mac_address(&sa, dev_net(tap->dev), tap->dev->name);
		dev_get_mac_address((struct sockaddr *)&ss, dev_net(tap->dev),
				    tap->dev->name);
		if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) ||
		    copy_to_user(&ifr->ifr_hwaddr, &sa, sizeof(sa)))
		    copy_to_user(&ifr->ifr_hwaddr, &ss, sizeof(ifr->ifr_hwaddr)))
			ret = -EFAULT;
		tap_put_tap_dev(tap);
		rtnl_unlock();
		return ret;

	case SIOCSIFHWADDR:
		if (copy_from_user(&sa, &ifr->ifr_hwaddr, sizeof(sa)))
		if (copy_from_user(&ss, &ifr->ifr_hwaddr, sizeof(ifr->ifr_hwaddr)))
			return -EFAULT;
		rtnl_lock();
		tap = tap_get_tap_dev(q);
@@ -1017,7 +1018,10 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
			rtnl_unlock();
			return -ENOLINK;
		}
		ret = dev_set_mac_address_user(tap->dev, &sa, NULL);
		if (tap->dev->addr_len > sizeof(ifr->ifr_hwaddr))
			ret = -EINVAL;
		else
			ret = dev_set_mac_address_user(tap->dev, &ss, NULL);
		tap_put_tap_dev(tap);
		rtnl_unlock();
		return ret;
Loading