From: Tobias Brunner Date: Thu, 9 Apr 2015 12:43:07 +0000 (+0200) Subject: kernel-netlink: Ignore unusable routes X-Git-Tag: 5.3.1rc1~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6716c6526e47c392655c5f0e6aa449a9eb6f5f94;p=thirdparty%2Fstrongswan.git kernel-netlink: Ignore unusable routes --- diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c index a431e49b70..1515b01ccd 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c @@ -1550,6 +1550,26 @@ static void rt_entry_destroy(rt_entry_t *this) free(this); } +/** + * Check if the route received with RTM_NEWROUTE is usable based on its type. + */ +static bool route_usable(struct nlmsghdr *hdr) +{ + struct rtmsg *msg; + + msg = NLMSG_DATA(hdr); + switch (msg->rtm_type) + { + case RTN_BLACKHOLE: + case RTN_UNREACHABLE: + case RTN_PROHIBIT: + case RTN_THROW: + return FALSE; + default: + return TRUE; + } +} + /** * Parse route received with RTM_NEWROUTE. The given rt_entry_t object will be * reused if not NULL. @@ -1700,6 +1720,10 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest, rt_entry_t *other; uintptr_t table; + if (!route_usable(current)) + { + continue; + } route = parse_route(current, route); table = (uintptr_t)route->table;