aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-12-13 16:48:21 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-13 16:51:51 -0500
commitb43faac69062f0fc75bd3230d67da64e184232d1 (patch)
tree0b6c90f5a2fb9e07d2fce5b57fabc8cf6580aaeb /net/ipv6
parent5c3ddec73d01a1fae9409c197078cb02c42238c3 (diff)
ipv6: If neigh lookup fails during icmp6 dst allocation, propagate error.
Don't just succeed with a route that has a NULL neighbour attached. This follows the behavior of addrconf_dst_alloc(). Allowing this kind of route to end up with a NULL neigh attached will result in packet drops on output until the route is somehow invalidated, since nothing will meanwhile try to lookup the neigh again. A statistic is bumped for the case where we see a neigh-less route on output, but the resulting packet drop is otherwise silent in nature, and frankly it's a hard error for this to happen and ipv6 should do what ipv4 does which is say something in the kernel logs. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/route.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index d98cf41edf2a..4bf362baa97a 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1089,8 +1089,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
1089 neigh_hold(neigh); 1089 neigh_hold(neigh);
1090 else { 1090 else {
1091 neigh = __neigh_lookup_errno(&nd_tbl, &fl6->daddr, dev); 1091 neigh = __neigh_lookup_errno(&nd_tbl, &fl6->daddr, dev);
1092 if (IS_ERR(neigh)) 1092 if (IS_ERR(neigh)) {
1093 neigh = NULL; 1093 dst_free(&rt->dst);
1094 return ERR_CAST(neigh);
1095 }
1094 } 1096 }
1095 1097
1096 rt->dst.flags |= DST_HOST; 1098 rt->dst.flags |= DST_HOST;