diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-13 16:48:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-13 16:51:51 -0500 |
commit | b43faac69062f0fc75bd3230d67da64e184232d1 (patch) | |
tree | 0b6c90f5a2fb9e07d2fce5b57fabc8cf6580aaeb /net/ipv6 | |
parent | 5c3ddec73d01a1fae9409c197078cb02c42238c3 (diff) | |
download | linux-b43faac69062f0fc75bd3230d67da64e184232d1.tar.gz linux-b43faac69062f0fc75bd3230d67da64e184232d1.tar.bz2 linux-b43faac69062f0fc75bd3230d67da64e184232d1.zip |
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.c | 6 |
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, neigh_hold(neigh); else { neigh = __neigh_lookup_errno(&nd_tbl, &fl6->daddr, dev); - if (IS_ERR(neigh)) - neigh = NULL; + if (IS_ERR(neigh)) { + dst_free(&rt->dst); + return ERR_CAST(neigh); + } } rt->dst.flags |= DST_HOST; |