arp: Convert SIOCDARP and SIOCSARP to per-netns RTNL.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Tue, 11 Feb 2025 04:50:57 +0000 (13:50 +0900)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 13 Feb 2025 10:33:44 +0000 (11:33 +0100)
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: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250211045057.10419-1-kuniyu@amazon.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/arp.c

index cb9a7ed8abd3ab17403f226ea7e31ea2bae52a9f..431d900c136c4ddc44907a1af14c3b5033df6729 100644 (file)
@@ -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();