diff options
author | Dave Barach <dave@barachs.net> | 2019-07-23 16:28:36 -0400 |
---|---|---|
committer | Dave Barach <dave@barachs.net> | 2019-07-23 16:29:10 -0400 |
commit | 3940de36728b768574a3e998389bb90d55f690d1 (patch) | |
tree | f3c04d65748319ca38cbabce43c918f7ea745f1d /src/vnet/l2 | |
parent | b725ebb3f47302c416e41c7be3f5a8bb3c9fe547 (diff) |
api: binary api cleanup
Multiple API message handlers call vnet_get_sup_hw_interface(...)
without checking the inbound sw_if_index. This can cause a
pool_elt_at_index ASSERT in a debug image, and major disorder in a
production image.
Given that a number of places are coded as follows, add an
"api_visible_or_null" variant of vnet_get_sup_hw_interface, which
returns NULL given an invalid sw_if_index, or a hidden sw interface:
- hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
+ hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hw == NULL || memif_device_class.index != hw->dev_class_index)
return clib_error_return (0, "not a memif interface");
Rename two existing xxx_safe functions -> xxx_or_null to make it
obvious what they return.
Type: fix
Change-Id: I29996e8d0768fd9e0c5495bd91ff8bedcf2c5697
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vnet/l2')
-rw-r--r-- | src/vnet/l2/l2_fib.c | 5 | ||||
-rw-r--r-- | src/vnet/l2/l2_vtr.c | 6 |
2 files changed, 6 insertions, 5 deletions
diff --git a/src/vnet/l2/l2_fib.c b/src/vnet/l2/l2_fib.c index b7646cac4cd..600d0c910fc 100644 --- a/src/vnet/l2/l2_fib.c +++ b/src/vnet/l2/l2_fib.c @@ -95,12 +95,13 @@ format_vnet_sw_if_index_name_with_NA (u8 * s, va_list * args) if (sw_if_index == ~0) return format (s, "N/A"); - vnet_sw_interface_t *swif = vnet_get_sw_interface_safe (vnm, sw_if_index); + vnet_sw_interface_t *swif = + vnet_get_sw_interface_or_null (vnm, sw_if_index); if (!swif) return format (s, "Stale"); return format (s, "%U", format_vnet_sw_interface_name, vnm, - vnet_get_sw_interface_safe (vnm, sw_if_index)); + vnet_get_sw_interface_or_null (vnm, sw_if_index)); } typedef struct l2fib_dump_walk_ctx_t_ diff --git a/src/vnet/l2/l2_vtr.c b/src/vnet/l2/l2_vtr.c index aa3d5c45bee..bfd1dcb9280 100644 --- a/src/vnet/l2/l2_vtr.c +++ b/src/vnet/l2/l2_vtr.c @@ -61,7 +61,7 @@ l2pbb_configure (vlib_main_t * vlib_main, l2_output_config_t *config = 0; vnet_hw_interface_t *hi; - hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index); + hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index); if (!hi) { @@ -149,7 +149,7 @@ l2vtr_configure (vlib_main_t * vlib_main, vnet_main_t * vnet_main, u32 sw_if_ind u32 push_outer_et; u32 cfg_tags; - hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index); + hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index); if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index)) { error = VNET_API_ERROR_INVALID_INTERFACE; /* non-ethernet interface */ @@ -364,7 +364,7 @@ l2vtr_get (vlib_main_t * vlib_main, vnet_main_t * vnet_main, u32 sw_if_index, u3 *vtr_tag2 = 0; *push_dot1q = 0; - hi = vnet_get_sup_hw_interface (vnet_main, sw_if_index); + hi = vnet_get_sup_hw_interface_api_visible_or_null (vnet_main, sw_if_index); if (!hi || (hi->hw_class_index != ethernet_hw_interface_class.index)) { /* non-ethernet interface */ |