Re: [PATCH net-next] sockopt: Change getsockopt() of SO_BINDTODEVICE to return an interface name
flat view
From: Ben Hutchings <hidden>
Date: 2012-11-02 23:34:39
On Fri, 2012-11-02 at 11:02 -0400, Brian Haley wrote:
On 11/02/2012 05:36 AM, Pavel Emelyanov wrote:quoted
quoted
+static int sock_getbindtodevice(struct sock *sk, char __user *optval, + int __user *optlen, int len) +{ + int ret = -ENOPROTOOPT; +#ifdef CONFIG_NETDEVICES + struct net *net = sock_net(sk); + struct net_device *dev; + char devname[IFNAMSIZ]; + + if (sk->sk_bound_dev_if == 0) { + len = 0; + goto zero; + } + + ret = -EINVAL; + if (len < IFNAMSIZ) + goto out; + + rcu_read_lock(); + dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); + if (dev) + strcpy(devname, dev->name);This still races with the device name change, potentially providing a name which never existed in the system, doesn't it?My only argument here is that SIOCGIFNAME has had this same code forever, and noone has ever complained about that returning a garbled name. Even dev_get_by_name() only holds an rcu lock when doing a strncmp(). We'd need to audit the whole kernel to catch all the places where we potentially look at dev->name while it could change. Is it really worth it?
A net device name can't be changed while the device is up, or while another task holds the RTNL lock. I think that covers almost all uses. I don't know whether it's worth going out to look for exceptions, but we might as well fix the cases we know about. Ben. -- Ben Hutchings, Staff Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.