]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Ensure VRF is created with correct id
authorvivek <vivek@cumulusnetworks.com>
Mon, 4 Apr 2016 17:58:06 +0000 (10:58 -0700)
committervivek <vivek@cumulusnetworks.com>
Tue, 5 Apr 2016 15:39:16 +0000 (08:39 -0700)
In function vrf_get(), an early call to vrf_get_by_name() may end up
creating the Zebra VRF structure prior to the VRF id being set,
resulting in various other misbehavior. Fix this with appropriate
changes.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Ticket: CM-10258
Reviewed By: CCR-4418
Testing Done: Manual

lib/vrf.c

index 2421918132b20aef3c2dfb574dba710cad901555..05c94841d5db658af1732c2f31151599f22df451 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -150,6 +150,7 @@ vrf_get (vrf_id_t vrf_id, const char *name)
   struct prefix p;
   struct route_node *rn;
   struct vrf *vrf = NULL;
+  size_t namelen;
 
   vrf_build_key (vrf_id, &p);
   rn = route_node_get (vrf_table, &p);
@@ -172,7 +173,7 @@ vrf_get (vrf_id_t vrf_id, const char *name)
   else
     {
       if (name)
-        vrf = vrf_get_by_name(name);
+        vrf = vrf_list_lookup_by_name(name);
 
       if (vrf)
        {
@@ -182,10 +183,27 @@ vrf_get (vrf_id_t vrf_id, const char *name)
        }
       else
        {
+          if (name)
+            {
+              namelen = strlen (name);
+              if (namelen > VRF_NAMSIZ)
+                {
+                  zlog_err("Attempt to get/create VRF %u name %s - name too long",
+                           vrf_id, name);
+                  return NULL;
+                }
+            }
+
          vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf));
          if (debug_vrf)
            zlog_debug ("VRF(%u) %s is created.",
                        vrf_id, (name) ? name : "(NULL)");
+          if (name)
+            {
+              strncpy (vrf->name, name, namelen);
+              vrf->name[namelen] = '\0';
+              listnode_add_sort (vrf_list, vrf);
+            }
        }
       vrf->vrf_id = vrf_id;
       rn->info = vrf;