diff options
author | vivek <vivek@cumulusnetworks.com> | 2016-04-04 19:58:06 +0200 |
---|---|---|
committer | vivek <vivek@cumulusnetworks.com> | 2016-04-05 17:39:16 +0200 |
commit | 8087b296b4750eda2d34e4f48731f81415bdccd2 (patch) | |
tree | a3903ff7e4cb0f07f3572d5995f12f50ecd3a4fe /lib/vrf.c | |
parent | bgpd: Another hash_get crash fix (diff) | |
download | frr-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.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -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; |