From 7239d3d9e6c131c859dae627c1238b5838a5ab8e Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Mon, 2 Mar 2020 18:42:56 -0500 Subject: [PATCH] lib: handle bogus VRF backend type And use an enum... Signed-off-by: Quentin Young --- lib/vrf.c | 9 +++++++-- lib/vrf.h | 15 +++++++++------ lib/zclient.c | 9 ++++++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/vrf.c b/lib/vrf.c index 31ea2d6c4c..fc5aa8f2b6 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -593,10 +593,15 @@ int vrf_get_backend(void) return vrf_backend; } -void vrf_configure_backend(int vrf_backend_netns) +int vrf_configure_backend(enum vrf_backend_type backend) { - vrf_backend = vrf_backend_netns; + if (backend > VRF_BACKEND_MAX) + return -1; + + vrf_backend = backend; vrf_backend_configured = 1; + + return 0; } int vrf_handler_create(struct vty *vty, const char *vrfname, diff --git a/lib/vrf.h b/lib/vrf.h index f231d2433f..2dc2648837 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -101,9 +101,12 @@ RB_PROTOTYPE(vrf_name_head, vrf, name_entry, vrf_name_compare) DECLARE_QOBJ_TYPE(vrf) /* Allow VRF with netns as backend */ -#define VRF_BACKEND_VRF_LITE 0 -#define VRF_BACKEND_NETNS 1 -#define VRF_BACKEND_UNKNOWN 2 +enum vrf_backend_type { + VRF_BACKEND_VRF_LITE, + VRF_BACKEND_NETNS, + VRF_BACKEND_UNKNOWN, + VRF_BACKEND_MAX, +}; extern struct vrf_id_head vrfs_by_id; extern struct vrf_name_head vrfs_by_name; @@ -292,10 +295,10 @@ extern void vrf_install_commands(void); * VRF utilities */ -/* API for configuring VRF backend - * should be called from zebra only +/* + * API for configuring VRF backend */ -extern void vrf_configure_backend(int vrf_backend_netns); +extern int vrf_configure_backend(enum vrf_backend_type backend); extern int vrf_get_backend(void); extern int vrf_is_backend_netns(void); diff --git a/lib/zclient.c b/lib/zclient.c index b32be1c310..673e71c515 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -3031,7 +3031,14 @@ static void zclient_capability_decode(ZAPI_CALLBACK_ARGS) uint8_t mpls_enabled; STREAM_GETL(s, vrf_backend); - vrf_configure_backend(vrf_backend); + + if (vrf_backend < 0 || vrf_configure_backend(vrf_backend)) { + flog_err(EC_LIB_ZAPI_ENCODE, + "%s: Garbage VRF backend type: %d\n", __func__, + vrf_backend); + goto stream_failure; + } + memset(&cap, 0, sizeof(cap)); STREAM_GETC(s, mpls_enabled); -- 2.39.5