|
@@ -2784,7 +2784,7 @@ static int packet_release(struct socket *sock)
|
|
static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto)
|
|
static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto)
|
|
{
|
|
{
|
|
struct packet_sock *po = pkt_sk(sk);
|
|
struct packet_sock *po = pkt_sk(sk);
|
|
- const struct net_device *dev_curr;
|
|
|
|
|
|
+ struct net_device *dev_curr;
|
|
__be16 proto_curr;
|
|
__be16 proto_curr;
|
|
bool need_rehook;
|
|
bool need_rehook;
|
|
|
|
|
|
@@ -2808,15 +2808,13 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 proto)
|
|
|
|
|
|
po->num = proto;
|
|
po->num = proto;
|
|
po->prot_hook.type = proto;
|
|
po->prot_hook.type = proto;
|
|
-
|
|
|
|
- if (po->prot_hook.dev)
|
|
|
|
- dev_put(po->prot_hook.dev);
|
|
|
|
-
|
|
|
|
po->prot_hook.dev = dev;
|
|
po->prot_hook.dev = dev;
|
|
|
|
|
|
po->ifindex = dev ? dev->ifindex : 0;
|
|
po->ifindex = dev ? dev->ifindex : 0;
|
|
packet_cached_dev_assign(po, dev);
|
|
packet_cached_dev_assign(po, dev);
|
|
}
|
|
}
|
|
|
|
+ if (dev_curr)
|
|
|
|
+ dev_put(dev_curr);
|
|
|
|
|
|
if (proto == 0 || !need_rehook)
|
|
if (proto == 0 || !need_rehook)
|
|
goto out_unlock;
|
|
goto out_unlock;
|