Commit 3fd91fb3 authored by Li RongQing's avatar Li RongQing Committed by David S. Miller

ipv6: recursive check rt->dst.from when call rt6_check_expired

If dst cache dst_a copies from dst_b, and dst_b copies from dst_c, check
if dst_a is expired or not, we should not end with dst_a->dst.from, dst_b,
we should check dst_c.

CC: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: default avatarLi RongQing <roy.qing.li@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b40863c6
...@@ -369,15 +369,11 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, ...@@ -369,15 +369,11 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
static bool rt6_check_expired(const struct rt6_info *rt) static bool rt6_check_expired(const struct rt6_info *rt)
{ {
struct rt6_info *ort = NULL;
if (rt->rt6i_flags & RTF_EXPIRES) { if (rt->rt6i_flags & RTF_EXPIRES) {
if (time_after(jiffies, rt->dst.expires)) if (time_after(jiffies, rt->dst.expires))
return true; return true;
} else if (rt->dst.from) { } else if (rt->dst.from) {
ort = (struct rt6_info *) rt->dst.from; return rt6_check_expired((struct rt6_info *) rt->dst.from);
return (ort->rt6i_flags & RTF_EXPIRES) &&
time_after(jiffies, ort->dst.expires);
} }
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment