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/plugins | |
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/plugins')
-rw-r--r-- | src/plugins/avf/avf_api.c | 4 | ||||
-rw-r--r-- | src/plugins/avf/cli.c | 4 | ||||
-rw-r--r-- | src/plugins/marvell/pp2/cli.c | 2 | ||||
-rw-r--r-- | src/plugins/memif/cli.c | 2 | ||||
-rw-r--r-- | src/plugins/memif/memif_api.c | 7 | ||||
-rw-r--r-- | src/plugins/rdma/cli.c | 2 | ||||
-rw-r--r-- | src/plugins/vmxnet3/cli.c | 4 | ||||
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3_api.c | 6 |
8 files changed, 19 insertions, 12 deletions
diff --git a/src/plugins/avf/avf_api.c b/src/plugins/avf/avf_api.c index 3503177837f..e9c7f49e2e5 100644 --- a/src/plugins/avf/avf_api.c +++ b/src/plugins/avf/avf_api.c @@ -94,7 +94,9 @@ vl_api_avf_delete_t_handler (vl_api_avf_delete_t * mp) vnet_hw_interface_t *hw; int rv = 0; - hw = vnet_get_sup_hw_interface (vnm, htonl (mp->sw_if_index)); + hw = + vnet_get_sup_hw_interface_api_visible_or_null (vnm, + htonl (mp->sw_if_index)); if (hw == NULL || avf_device_class.index != hw->dev_class_index) { rv = VNET_API_ERROR_INVALID_INTERFACE; diff --git a/src/plugins/avf/cli.c b/src/plugins/avf/cli.c index f8fc05a9812..414163ac8a2 100644 --- a/src/plugins/avf/cli.c +++ b/src/plugins/avf/cli.c @@ -109,7 +109,7 @@ avf_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || avf_device_class.index != hw->dev_class_index) return clib_error_return (0, "not an AVF interface"); @@ -168,7 +168,7 @@ avf_test_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || avf_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a AVF interface"); diff --git a/src/plugins/marvell/pp2/cli.c b/src/plugins/marvell/pp2/cli.c index 3264cc8638b..761cdb5b6b6 100644 --- a/src/plugins/marvell/pp2/cli.c +++ b/src/plugins/marvell/pp2/cli.c @@ -94,7 +94,7 @@ mrvl_pp2_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || mrvl_pp2_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a Marvell PP2 interface"); diff --git a/src/plugins/memif/cli.c b/src/plugins/memif/cli.c index dd13adb929b..00c947a594a 100644 --- a/src/plugins/memif/cli.c +++ b/src/plugins/memif/cli.c @@ -298,7 +298,7 @@ memif_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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"); diff --git a/src/plugins/memif/memif_api.c b/src/plugins/memif/memif_api.c index bbc9e5c7c4a..ebe7a35c820 100644 --- a/src/plugins/memif/memif_api.c +++ b/src/plugins/memif/memif_api.c @@ -209,11 +209,14 @@ vl_api_memif_delete_t_handler (vl_api_memif_delete_t * mp) vlib_main_t *vm = vlib_get_main (); vnet_main_t *vnm = vnet_get_main (); vl_api_memif_delete_reply_t *rmp; - vnet_hw_interface_t *hi = - vnet_get_sup_hw_interface (vnm, ntohl (mp->sw_if_index)); + vnet_hw_interface_t *hi; memif_if_t *mif; int rv = 0; + hi = + vnet_get_sup_hw_interface_api_visible_or_null (vnm, + ntohl (mp->sw_if_index)); + if (hi == NULL || memif_device_class.index != hi->dev_class_index) rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; else diff --git a/src/plugins/rdma/cli.c b/src/plugins/rdma/cli.c index 1f377a738fc..d4ef17d020c 100644 --- a/src/plugins/rdma/cli.c +++ b/src/plugins/rdma/cli.c @@ -107,7 +107,7 @@ rdma_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || rdma_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a RDMA interface"); diff --git a/src/plugins/vmxnet3/cli.c b/src/plugins/vmxnet3/cli.c index 776901e8ac2..1d75b0cf7df 100644 --- a/src/plugins/vmxnet3/cli.c +++ b/src/plugins/vmxnet3/cli.c @@ -108,7 +108,7 @@ vmxnet3_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || vmxnet3_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a vmxnet3 interface"); @@ -165,7 +165,7 @@ vmxnet3_test_command_fn (vlib_main_t * vm, unformat_input_t * input, return clib_error_return (0, "please specify interface name or sw_if_index"); - 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 || vmxnet3_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a vmxnet3 interface"); diff --git a/src/plugins/vmxnet3/vmxnet3_api.c b/src/plugins/vmxnet3/vmxnet3_api.c index 5e1bb9e2f18..541ca732e6d 100644 --- a/src/plugins/vmxnet3/vmxnet3_api.c +++ b/src/plugins/vmxnet3/vmxnet3_api.c @@ -97,10 +97,12 @@ vl_api_vmxnet3_delete_t_handler (vl_api_vmxnet3_delete_t * mp) vnet_hw_interface_t *hw; int rv = 0; - hw = vnet_get_sup_hw_interface (vnm, htonl (mp->sw_if_index)); + hw = + vnet_get_sup_hw_interface_api_visible_or_null (vnm, + htonl (mp->sw_if_index)); if (hw == NULL || vmxnet3_device_class.index != hw->dev_class_index) { - rv = VNET_API_ERROR_INVALID_INTERFACE; + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; goto reply; } |