|
@@ -4298,19 +4298,13 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
|
|
if (!ipv6_addr_any(&fl6.saddr))
|
|
|
flags |= RT6_LOOKUP_F_HAS_SADDR;
|
|
|
|
|
|
- if (!fibmatch)
|
|
|
- dst = ip6_route_input_lookup(net, dev, &fl6, flags);
|
|
|
- else
|
|
|
- dst = ip6_route_lookup(net, &fl6, 0);
|
|
|
+ dst = ip6_route_input_lookup(net, dev, &fl6, flags);
|
|
|
|
|
|
rcu_read_unlock();
|
|
|
} else {
|
|
|
fl6.flowi6_oif = oif;
|
|
|
|
|
|
- if (!fibmatch)
|
|
|
- dst = ip6_route_output(net, NULL, &fl6);
|
|
|
- else
|
|
|
- dst = ip6_route_lookup(net, &fl6, 0);
|
|
|
+ dst = ip6_route_output(net, NULL, &fl6);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -4327,6 +4321,15 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
|
|
goto errout;
|
|
|
}
|
|
|
|
|
|
+ if (fibmatch && rt->dst.from) {
|
|
|
+ struct rt6_info *ort = container_of(rt->dst.from,
|
|
|
+ struct rt6_info, dst);
|
|
|
+
|
|
|
+ dst_hold(&ort->dst);
|
|
|
+ ip6_rt_put(rt);
|
|
|
+ rt = ort;
|
|
|
+ }
|
|
|
+
|
|
|
skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
|
|
|
if (!skb) {
|
|
|
ip6_rt_put(rt);
|