summaryrefslogtreecommitdiffstats
path: root/lib/vrf.c
diff options
context:
space:
mode:
authorvivek <vivek@cumulusnetworks.com>2016-04-04 19:58:06 +0200
committervivek <vivek@cumulusnetworks.com>2016-04-05 17:39:16 +0200
commit8087b296b4750eda2d34e4f48731f81415bdccd2 (patch)
treea3903ff7e4cb0f07f3572d5995f12f50ecd3a4fe /lib/vrf.c
parentbgpd: Another hash_get crash fix (diff)
downloadfrr-8087b296b4750eda2d34e4f48731f81415bdccd2.tar.xz
frr-8087b296b4750eda2d34e4f48731f81415bdccd2.zip
lib: Ensure VRF is created with correct id
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
Diffstat (limited to 'lib/vrf.c')
-rw-r--r--lib/vrf.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/vrf.c b/lib/vrf.c
index 242191813..05c94841d 100644
--- 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;