ipv6: Fix result generation in ipv6_get_ifaddr().
authorDavid S. Miller <davem@davemloft.net>
Fri, 26 Mar 2010 04:39:21 +0000 (21:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Mar 2010 04:39:21 +0000 (21:39 -0700)
Finishing naturally from hlist_for_each_entry(x, ...) does not result
in 'x' being NULL.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c

index 9995683..21b4c9e 100644 (file)
@@ -1341,9 +1341,9 @@ EXPORT_SYMBOL(ipv6_chk_prefix);
 struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *addr,
                                     struct net_device *dev, int strict)
 {
-       struct inet6_ifaddr *ifp = NULL;
-       struct hlist_node *node;
+       struct inet6_ifaddr *ifp, *result = NULL;
        unsigned int hash = ipv6_addr_hash(addr);
+       struct hlist_node *node;
 
        rcu_read_lock_bh();
        hlist_for_each_entry_rcu(ifp, node, &inet6_addr_lst[hash], addr_lst) {
@@ -1352,6 +1352,7 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *add
                if (ipv6_addr_equal(&ifp->addr, addr)) {
                        if (dev == NULL || ifp->idev->dev == dev ||
                            !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) {
+                               result = ifp;
                                in6_ifa_hold(ifp);
                                break;
                        }
@@ -1359,7 +1360,7 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *add
        }
        rcu_read_unlock_bh();
 
-       return ifp;
+       return result;
 }
 
 /* Gets referenced address, destroys ifaddr */