summaryrefslogtreecommitdiffstats
path: root/src/vnet/devices/virtio/vhost_user.c
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2019-07-23 16:28:36 -0400
committerDave Barach <dave@barachs.net>2019-07-23 16:29:10 -0400
commit3940de36728b768574a3e998389bb90d55f690d1 (patch)
treef3c04d65748319ca38cbabce43c918f7ea745f1d /src/vnet/devices/virtio/vhost_user.c
parentb725ebb3f47302c416e41c7be3f5a8bb3c9fe547 (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/devices/virtio/vhost_user.c')
-rw-r--r--src/vnet/devices/virtio/vhost_user.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/vnet/devices/virtio/vhost_user.c b/src/vnet/devices/virtio/vhost_user.c
index 5c552f9be27..e26cfdfd8c8 100644
--- a/src/vnet/devices/virtio/vhost_user.c
+++ b/src/vnet/devices/virtio/vhost_user.c
@@ -1250,8 +1250,10 @@ vhost_user_delete_if (vnet_main_t * vnm, vlib_main_t * vm, u32 sw_if_index)
vnet_hw_interface_t *hwif;
u16 qid;
- if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
- hwif->dev_class_index != vhost_user_device_class.index)
+ if (!
+ (hwif =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+ || hwif->dev_class_index != vhost_user_device_class.index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
vui = pool_elt_at_index (vum->vhost_user_interfaces, hwif->dev_instance);
@@ -1534,8 +1536,10 @@ vhost_user_modify_if (vnet_main_t * vnm, vlib_main_t * vm,
vnet_hw_interface_t *hwif;
uword *if_index;
- if (!(hwif = vnet_get_sup_hw_interface (vnm, sw_if_index)) ||
- hwif->dev_class_index != vhost_user_device_class.index)
+ if (!
+ (hwif =
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index))
+ || hwif->dev_class_index != vhost_user_device_class.index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
if (sock_filename == NULL || !(strlen (sock_filename) > 0))
@@ -1658,7 +1662,7 @@ vhost_user_delete_command_fn (vlib_main_t * vm,
&sw_if_index))
{
vnet_hw_interface_t *hwif =
- vnet_get_sup_hw_interface (vnm, sw_if_index);
+ vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index);
if (hwif == NULL ||
vhost_user_device_class.index != hwif->dev_class_index)
{