Commit 7aca0d8a authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Paolo Abeni
Browse files

arp: Convert SIOCDARP and SIOCSARP to per-netns RTNL.



ioctl(SIOCDARP/SIOCSARP) operates on a single netns fetched from
an AF_INET socket in inet_ioctl().

Let's hold rtnl_net_lock() for SIOCDARP and SIOCSARP.

Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250211045057.10419-1-kuniyu@amazon.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a3783dbf
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1062,8 +1062,8 @@ static int arp_req_set_proxy(struct net *net, struct net_device *dev, int on)
		IPV4_DEVCONF_ALL(net, PROXY_ARP) = on;
		return 0;
	}
	if (__in_dev_get_rtnl(dev)) {
		IN_DEV_CONF_SET(__in_dev_get_rtnl(dev), PROXY_ARP, on);
	if (__in_dev_get_rtnl_net(dev)) {
		IN_DEV_CONF_SET(__in_dev_get_rtnl_net(dev), PROXY_ARP, on);
		return 0;
	}
	return -ENXIO;
@@ -1293,14 +1293,14 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)

	switch (cmd) {
	case SIOCDARP:
		rtnl_lock();
		rtnl_net_lock(net);
		err = arp_req_delete(net, &r);
		rtnl_unlock();
		rtnl_net_unlock(net);
		break;
	case SIOCSARP:
		rtnl_lock();
		rtnl_net_lock(net);
		err = arp_req_set(net, &r);
		rtnl_unlock();
		rtnl_net_unlock(net);
		break;
	case SIOCGARP:
		rcu_read_lock();