diff options
author | Dave Barach <dave@barachs.net> | 2019-07-23 16:28:36 -0400 |
---|---|---|
committer | Dave Barach <dave@barachs.net> | 2019-07-24 08:14:39 -0400 |
commit | b71b5ffbfb2ddbad408a22ef17046dfe5fea1cad (patch) | |
tree | 73490766e73d335ae722f45c89b092cfcd707b34 /src/vnet/interface_funcs.h | |
parent | 9fb50d83dbe22cab30532cec8c85e711af1f82ff (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>
(cherry picked from commit 3940de36728b768574a3e998389bb90d55f690d1)
Diffstat (limited to 'src/vnet/interface_funcs.h')
-rw-r--r-- | src/vnet/interface_funcs.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/vnet/interface_funcs.h b/src/vnet/interface_funcs.h index b862f48ef36..18a1065201b 100644 --- a/src/vnet/interface_funcs.h +++ b/src/vnet/interface_funcs.h @@ -47,7 +47,7 @@ vnet_get_hw_interface (vnet_main_t * vnm, u32 hw_if_index) } always_inline vnet_hw_interface_t * -vnet_get_hw_interface_safe (vnet_main_t * vnm, u32 hw_if_index) +vnet_get_hw_interface_or_null (vnet_main_t * vnm, u32 hw_if_index) { if (!pool_is_free_index (vnm->interface_main.hw_interfaces, hw_if_index)) return pool_elt_at_index (vnm->interface_main.hw_interfaces, hw_if_index); @@ -61,7 +61,7 @@ vnet_get_sw_interface (vnet_main_t * vnm, u32 sw_if_index) } always_inline vnet_sw_interface_t * -vnet_get_sw_interface_safe (vnet_main_t * vnm, u32 sw_if_index) +vnet_get_sw_interface_or_null (vnet_main_t * vnm, u32 sw_if_index) { if (!pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index)) return pool_elt_at_index (vnm->interface_main.sw_interfaces, sw_if_index); @@ -97,6 +97,22 @@ vnet_get_sup_hw_interface (vnet_main_t * vnm, u32 sw_if_index) return vnet_get_hw_interface (vnm, sw->hw_if_index); } +always_inline vnet_hw_interface_t * +vnet_get_sup_hw_interface_api_visible_or_null (vnet_main_t * vnm, + u32 sw_if_index) +{ + vnet_sw_interface_t *si; + if (PREDICT_FALSE (pool_is_free_index (vnm->interface_main.sw_interfaces, + sw_if_index))) + return NULL; + si = vnet_get_sup_sw_interface (vnm, sw_if_index); + if (PREDICT_FALSE (si->flags & VNET_SW_INTERFACE_FLAG_HIDDEN)) + return NULL; + ASSERT ((si->type == VNET_SW_INTERFACE_TYPE_HARDWARE) || + (si->type == VNET_SW_INTERFACE_TYPE_PIPE)); + return vnet_get_hw_interface (vnm, si->hw_if_index); +} + always_inline vnet_hw_interface_class_t * vnet_get_hw_interface_class (vnet_main_t * vnm, u32 hw_class_index) { |