diff options
| author | Russ White <russ@riw.us> | 2018-07-29 08:32:14 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-29 08:32:14 -0400 |
| commit | 22939e78f1851de683b2c7ef94664d2ea2df63bf (patch) | |
| tree | 22702ffe52c0602c93598f38b96eb2d091853535 /zebra/rt_netlink.c | |
| parent | a31f28f9c2ea14fd12ebb6b7428e81936f47e55d (diff) | |
| parent | 2e2b0fb3c289fd241a02c62bbaccdbf502bfe353 (diff) | |
Merge pull request #2700 from sworleys/Netlink-Prefix-Len-Check
zebra: Add check for prefix length from kernel messages
Diffstat (limited to 'zebra/rt_netlink.c')
| -rw-r--r-- | zebra/rt_netlink.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 80841b6ac1..5facfa5faa 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -384,6 +384,12 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, if (rtm->rtm_family == AF_INET) { p.family = AF_INET; + if (rtm->rtm_dst_len > IPV4_MAX_BITLEN) { + zlog_err( + "Invalid destination prefix length: %u received from kernel route change", + rtm->rtm_dst_len); + return -1; + } memcpy(&p.u.prefix4, dest, 4); p.prefixlen = rtm->rtm_dst_len; @@ -398,10 +404,22 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id, src_p.prefixlen = 0; } else if (rtm->rtm_family == AF_INET6) { p.family = AF_INET6; + if (rtm->rtm_dst_len > IPV6_MAX_BITLEN) { + zlog_err( + "Invalid destination prefix length: %u received from kernel route change", + rtm->rtm_dst_len); + return -1; + } memcpy(&p.u.prefix6, dest, 16); p.prefixlen = rtm->rtm_dst_len; src_p.family = AF_INET6; + if (rtm->rtm_src_len > IPV6_MAX_BITLEN) { + zlog_err( + "Invalid source prefix length: %u received from kernel route change", + rtm->rtm_src_len); + return -1; + } memcpy(&src_p.prefix, src, 16); src_p.prefixlen = rtm->rtm_src_len; } |
