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: Li RongQing <roy.qing.li@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
b40863c667
Коммит
3fd91fb358
|
@ -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)
|
||||
{
|
||||
struct rt6_info *ort = NULL;
|
||||
|
||||
if (rt->rt6i_flags & RTF_EXPIRES) {
|
||||
if (time_after(jiffies, rt->dst.expires))
|
||||
return true;
|
||||
} else if (rt->dst.from) {
|
||||
ort = (struct rt6_info *) rt->dst.from;
|
||||
return (ort->rt6i_flags & RTF_EXPIRES) &&
|
||||
time_after(jiffies, ort->dst.expires);
|
||||
return rt6_check_expired((struct rt6_info *) rt->dst.from);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче