]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: use the vrf_bitmap_*() helper functions when necessary
authorRenato Westphal <renato@opensourcerouting.org>
Fri, 19 Oct 2018 18:55:22 +0000 (15:55 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 17 Dec 2018 14:14:05 +0000 (12:14 -0200)
zclient->redist[afi][type] is a hash table and not an integer since a
while ago when VRF support was introduced. As such, zclient->redist[][]
should never be manipulated directly, the vrf_bitmap_*() helper functions
should be used instead. This fixes a few crashes found by the CLI fuzzer.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
bgpd/rfapi/vnc_zebra.c

index a982f288290212e862abfaea10b06465c8f66074..9b8431b5692d05cd39fe39d4a57786da789d0be1 100644 (file)
@@ -578,7 +578,9 @@ static void vnc_zebra_add_del_prefix(struct bgp *bgp,
                return;
        }
 
-       if (!zclient_vnc->redist[family2afi(rn->p.family)][ZEBRA_ROUTE_VNC])
+       if (!vrf_bitmap_check(zclient_vnc->redist[family2afi(rn->p.family)]
+                                                [ZEBRA_ROUTE_VNC],
+                             VRF_DEFAULT))
                return;
 
        if (!bgp->rfapi_cfg) {
@@ -642,7 +644,8 @@ static void vnc_zebra_add_del_nve(struct bgp *bgp, struct rfapi_descriptor *rfd,
        if (zclient_vnc->sock < 0)
                return;
 
-       if (!zclient_vnc->redist[afi][ZEBRA_ROUTE_VNC])
+       if (!vrf_bitmap_check(zclient_vnc->redist[afi][ZEBRA_ROUTE_VNC],
+                             VRF_DEFAULT))
                return;
 
        if (afi != AFI_IP && afi != AFI_IP6) {
@@ -839,12 +842,12 @@ int vnc_redistribute_set(struct bgp *bgp, afi_t afi, int type)
        //  bgp->redist[afi][type] = 1;
 
        /* Return if already redistribute flag is set. */
-       if (zclient_vnc->redist[afi][type])
+       if (vrf_bitmap_check(zclient_vnc->redist[afi][type], VRF_DEFAULT))
                return CMD_WARNING_CONFIG_FAILED;
 
        vrf_bitmap_set(zclient_vnc->redist[afi][type], VRF_DEFAULT);
 
-       // zclient_vnc->redist[afi][type] = 1;
+       // vrf_bitmap_set(zclient_vnc->redist[afi][type], VRF_DEFAULT);
 
        /* Return if zebra connection is not established. */
        if (zclient_vnc->sock < 0)
@@ -875,9 +878,9 @@ int vnc_redistribute_unset(struct bgp *bgp, afi_t afi, int type)
        bgp->rfapi_cfg->redist[afi][type] = 0;
 
        /* Return if zebra connection is disabled. */
-       if (!zclient_vnc->redist[afi][type])
+       if (!vrf_bitmap_check(zclient_vnc->redist[afi][type], VRF_DEFAULT))
                return CMD_WARNING_CONFIG_FAILED;
-       zclient_vnc->redist[afi][type] = 0;
+       vrf_bitmap_unset(zclient_vnc->redist[afi][type], VRF_DEFAULT);
 
        if (bgp->rfapi_cfg->redist[AFI_IP][type] == 0
            && bgp->rfapi_cfg->redist[AFI_IP6][type] == 0