]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add address family filters
authorStephen Worley <sworley@cumulusnetworks.com>
Thu, 19 Jul 2018 21:29:16 +0000 (17:29 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Mon, 23 Jul 2018 16:11:02 +0000 (12:11 -0400)
The zebra netlink socket was attempting to read netlink
messages with invalid address families in a couple areas.
Added filters and warn messages.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
zebra/if_netlink.c
zebra/rt_netlink.c
zebra/rule_netlink.c

index 8f6e31cfa8864a32c7ef868c4b9f9eddd026398f..2743f34cb4fd2f57934f7ac3f3c0d461c30c3b95 100644 (file)
@@ -891,8 +891,12 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        zns = zebra_ns_lookup(ns_id);
        ifa = NLMSG_DATA(h);
 
-       if (ifa->ifa_family != AF_INET && ifa->ifa_family != AF_INET6)
+       if (ifa->ifa_family != AF_INET && ifa->ifa_family != AF_INET6) {
+               zlog_warn(
+                       "Invalid address family: %d received from kernel interface addr change: %d",
+                       ifa->ifa_family, h->nlmsg_type);
                return 0;
+       }
 
        if (h->nlmsg_type != RTM_NEWADDR && h->nlmsg_type != RTM_DELADDR)
                return 0;
@@ -1114,6 +1118,14 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
                return 0;
        }
 
+       if (!(ifi->ifi_family == AF_UNSPEC || ifi->ifi_family == AF_BRIDGE
+             || ifi->ifi_family == AF_INET6)) {
+               zlog_warn(
+                       "Invalid address family: %d received from kernel link change: %d",
+                       ifi->ifi_family, h->nlmsg_type);
+               return 0;
+       }
+
        len = h->nlmsg_len - NLMSG_LENGTH(sizeof(struct ifinfomsg));
        if (len < 0) {
                zlog_err("%s: Message received from netlink is of a broken size %d %zu",
index 485abc3f1230331d214f325be3922f6af3a0fb3d..b639cf0c49c5dc68fc44ab79b9b1a67bbdc29a7e 100644 (file)
@@ -740,6 +740,16 @@ int netlink_route_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
                return 0;
        }
 
+       if (!(rtm->rtm_family == AF_INET || rtm->rtm_family == AF_INET6
+             || rtm->rtm_family == AF_ETHERNET || rtm->rtm_family == AF_EVPN
+             || rtm->rtm_family == AF_UNSPEC
+             || rtm->rtm_family == AF_FLOWSPEC)) {
+               zlog_warn(
+                       "Invalid address family: %d recieved from kernel route change: %d",
+                       rtm->rtm_family, h->nlmsg_type);
+               return 0;
+       }
+
        /* Connected route. */
        if (IS_ZEBRA_DEBUG_KERNEL)
                zlog_debug("%s %s %s proto %s NS %u",
@@ -2386,6 +2396,12 @@ int netlink_neigh_change(struct nlmsghdr *h, ns_id_t ns_id)
 
        if (ndm->ndm_family == AF_INET || ndm->ndm_family == AF_INET6)
                return netlink_ipneigh_change(h, len, ns_id);
+       else {
+               zlog_warn(
+                       "Invalid address family: %d recieved from kernel neighbor change: %d",
+                       ndm->ndm_family, h->nlmsg_type);
+               return 0;
+       }
 
        return 0;
 }
index c7a8517e17c73c0ea496db700a5df9db85d24960..d683e92bcc7dc3d69c0d4796a777da59d671e982 100644 (file)
@@ -204,8 +204,12 @@ int netlink_rule_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        }
 
        frh = NLMSG_DATA(h);
-       if (frh->family != AF_INET && frh->family != AF_INET6)
+       if (frh->family != AF_INET && frh->family != AF_INET6) {
+               zlog_warn(
+                       "Invalid address family: %d received from kernel rule change: %d",
+                       frh->family, h->nlmsg_type);
                return 0;
+       }
        if (frh->action != FR_ACT_TO_TBL)
                return 0;