Loading net/ipv6/mcast.c +14 −11 Original line number Original line Diff line number Diff line Loading @@ -303,21 +303,24 @@ static struct inet6_dev *ip6_mc_find_dev(struct net *net, dev = dev_get_by_index(net, ifindex); dev = dev_get_by_index(net, ifindex); if (!dev) if (!dev) return NULL; goto nodev; idev = in6_dev_get(dev); idev = in6_dev_get(dev); if (!idev) { if (!idev) dev_put(dev); goto release; return NULL; } read_lock_bh(&idev->lock); read_lock_bh(&idev->lock); if (idev->dead) { if (idev->dead) goto unlock_release; return idev; unlock_release: read_unlock_bh(&idev->lock); read_unlock_bh(&idev->lock); in6_dev_put(idev); in6_dev_put(idev); release: dev_put(dev); dev_put(dev); nodev: return NULL; return NULL; } } return idev; } void ipv6_sock_mc_close(struct sock *sk) void ipv6_sock_mc_close(struct sock *sk) { { Loading Loading
net/ipv6/mcast.c +14 −11 Original line number Original line Diff line number Diff line Loading @@ -303,21 +303,24 @@ static struct inet6_dev *ip6_mc_find_dev(struct net *net, dev = dev_get_by_index(net, ifindex); dev = dev_get_by_index(net, ifindex); if (!dev) if (!dev) return NULL; goto nodev; idev = in6_dev_get(dev); idev = in6_dev_get(dev); if (!idev) { if (!idev) dev_put(dev); goto release; return NULL; } read_lock_bh(&idev->lock); read_lock_bh(&idev->lock); if (idev->dead) { if (idev->dead) goto unlock_release; return idev; unlock_release: read_unlock_bh(&idev->lock); read_unlock_bh(&idev->lock); in6_dev_put(idev); in6_dev_put(idev); release: dev_put(dev); dev_put(dev); nodev: return NULL; return NULL; } } return idev; } void ipv6_sock_mc_close(struct sock *sk) void ipv6_sock_mc_close(struct sock *sk) { { Loading