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 | |
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')
-rw-r--r-- | src/vnet/adj/rewrite.c | 2 | ||||
-rw-r--r-- | src/vnet/bfd/bfd_cli.c | 2 | ||||
-rw-r--r-- | src/vnet/bfd/bfd_udp.c | 8 | ||||
-rw-r--r-- | src/vnet/devices/tap/tap.c | 6 | ||||
-rw-r--r-- | src/vnet/devices/virtio/cli.c | 2 | ||||
-rw-r--r-- | src/vnet/devices/virtio/vhost_user.c | 14 | ||||
-rw-r--r-- | src/vnet/devices/virtio/virtio_api.c | 6 | ||||
-rw-r--r-- | src/vnet/interface_api.c | 3 | ||||
-rw-r--r-- | src/vnet/interface_format.c | 2 | ||||
-rw-r--r-- | src/vnet/interface_funcs.h | 20 | ||||
-rw-r--r-- | src/vnet/l2/l2_fib.c | 5 | ||||
-rw-r--r-- | src/vnet/l2/l2_vtr.c | 6 | ||||
-rw-r--r-- | src/vnet/session/application_namespace.c | 3 |
13 files changed, 54 insertions, 25 deletions
diff --git a/src/vnet/adj/rewrite.c b/src/vnet/adj/rewrite.c index cf3cf416202..c8508c4b37a 100644 --- a/src/vnet/adj/rewrite.c +++ b/src/vnet/adj/rewrite.c @@ -53,7 +53,7 @@ format_vnet_rewrite (u8 * s, va_list * args) if (rw->sw_if_index != ~0) { vnet_sw_interface_t *si; - si = vnet_get_sw_interface_safe (vnm, rw->sw_if_index); + si = vnet_get_sw_interface_or_null (vnm, rw->sw_if_index); if (NULL != si) s = format (s, "%U:", format_vnet_sw_interface_name, vnm, si); else diff --git a/src/vnet/bfd/bfd_cli.c b/src/vnet/bfd/bfd_cli.c index cab20a65b0b..4b5f75eb01b 100644 --- a/src/vnet/bfd/bfd_cli.c +++ b/src/vnet/bfd/bfd_cli.c @@ -170,7 +170,7 @@ show_bfd (vlib_main_t * vm, unformat_input_t * input, if (is_set) { vnet_sw_interface_t *sw_if = - vnet_get_sw_interface_safe (&vnet_main, sw_if_index); + vnet_get_sw_interface_or_null (&vnet_main, sw_if_index); vnet_hw_interface_t *hw_if = vnet_get_hw_interface (&vnet_main, sw_if->hw_if_index); u8 *s = format (NULL, "UDP echo source is: %v\n", hw_if->name); diff --git a/src/vnet/bfd/bfd_udp.c b/src/vnet/bfd/bfd_udp.c index 5c0da0ad35e..cc3b40c4075 100644 --- a/src/vnet/bfd/bfd_udp.c +++ b/src/vnet/bfd/bfd_udp.c @@ -82,7 +82,7 @@ vnet_api_error_t bfd_udp_set_echo_source (u32 sw_if_index) { vnet_sw_interface_t *sw_if = - vnet_get_sw_interface_safe (bfd_udp_main.vnet_main, sw_if_index); + vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main, sw_if_index); if (sw_if) { bfd_udp_main.echo_source_sw_if_index = sw_if_index; @@ -114,8 +114,8 @@ bfd_udp_is_echo_available (bfd_transport_e transport) * pick an unused address from that subnet */ vnet_sw_interface_t *sw_if = - vnet_get_sw_interface_safe (bfd_udp_main.vnet_main, - bfd_udp_main.echo_source_sw_if_index); + vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main, + bfd_udp_main.echo_source_sw_if_index); if (sw_if && sw_if->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) { if (BFD_TRANSPORT_UDP4 == transport) @@ -566,7 +566,7 @@ bfd_udp_validate_api_input (u32 sw_if_index, { bfd_udp_main_t *bum = &bfd_udp_main; vnet_sw_interface_t *sw_if = - vnet_get_sw_interface_safe (bfd_udp_main.vnet_main, sw_if_index); + vnet_get_sw_interface_or_null (bfd_udp_main.vnet_main, sw_if_index); u8 local_ip_valid = 0; ip_interface_address_t *ia = NULL; if (!sw_if) diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c index c090bedbd7f..974a4175fa6 100644 --- a/src/vnet/devices/tap/tap.c +++ b/src/vnet/devices/tap/tap.c @@ -514,7 +514,7 @@ tap_delete_if (vlib_main_t * vm, u32 sw_if_index) virtio_if_t *vif; vnet_hw_interface_t *hw; - 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 || virtio_device_class.index != hw->dev_class_index) return VNET_API_ERROR_INVALID_SW_IF_INDEX; @@ -565,9 +565,11 @@ tap_gso_enable_disable (vlib_main_t * vm, u32 sw_if_index, int enable_disable) vnet_main_t *vnm = vnet_get_main (); virtio_main_t *mm = &virtio_main; virtio_if_t *vif; - vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index); + vnet_hw_interface_t *hw; clib_error_t *err = 0; + hw = vnet_get_sup_hw_interface_api_visible_or_null (vnm, sw_if_index); + if (hw == NULL || virtio_device_class.index != hw->dev_class_index) return VNET_API_ERROR_INVALID_SW_IF_INDEX; diff --git a/src/vnet/devices/virtio/cli.c b/src/vnet/devices/virtio/cli.c index 10b545edb5e..86639e486c9 100644 --- a/src/vnet/devices/virtio/cli.c +++ b/src/vnet/devices/virtio/cli.c @@ -96,7 +96,7 @@ virtio_pci_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 || virtio_device_class.index != hw->dev_class_index) return clib_error_return (0, "not a virtio interface"); 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) { diff --git a/src/vnet/devices/virtio/virtio_api.c b/src/vnet/devices/virtio/virtio_api.c index d73e6f877d5..e354958d5aa 100644 --- a/src/vnet/devices/virtio/virtio_api.c +++ b/src/vnet/devices/virtio/virtio_api.c @@ -99,10 +99,12 @@ vl_api_virtio_pci_delete_t_handler (vl_api_virtio_pci_delete_t * mp) vl_api_virtio_pci_delete_reply_t *rmp; vl_api_registration_t *reg; - 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 || virtio_device_class.index != hw->dev_class_index) { - rv = VNET_API_ERROR_INVALID_INTERFACE; + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; goto reply; } diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 50921f24e3f..fb1982ae8b0 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -1385,6 +1385,9 @@ interface_api_hookup (vlib_main_t * vm) am->is_mp_safe[VL_API_SW_INTERFACE_DETAILS] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_TAG_ADD_DEL] = 1; + /* Do not replay VL_API_SW_INTERFACE_DUMP messages */ + am->api_trace_cfg[VL_API_SW_INTERFACE_DUMP].replay_enable = 0; + /* * Set up the (msg_name, crc, message-id) table */ diff --git a/src/vnet/interface_format.c b/src/vnet/interface_format.c index 1a3ef026081..209da18979f 100644 --- a/src/vnet/interface_format.c +++ b/src/vnet/interface_format.c @@ -190,7 +190,7 @@ format_vnet_sw_if_index_name (u8 * s, va_list * args) u32 sw_if_index = va_arg (*args, u32); vnet_sw_interface_t *si; - si = vnet_get_sw_interface_safe (vnm, sw_if_index); + si = vnet_get_sw_interface_or_null (vnm, sw_if_index); if (NULL == si) { diff --git a/src/vnet/interface_funcs.h b/src/vnet/interface_funcs.h index 6d404b46098..c0ad81c6d87 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) { 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 */ diff --git a/src/vnet/session/application_namespace.c b/src/vnet/session/application_namespace.c index 47a369ed765..294192ceea1 100644 --- a/src/vnet/session/application_namespace.c +++ b/src/vnet/session/application_namespace.c @@ -70,7 +70,8 @@ vnet_app_namespace_add_del (vnet_app_namespace_add_del_args_t * a) if (a->is_add) { if (a->sw_if_index != APP_NAMESPACE_INVALID_INDEX - && !vnet_get_sw_interface_safe (vnet_get_main (), a->sw_if_index)) + && !vnet_get_sw_interface_or_null (vnet_get_main (), + a->sw_if_index)) return VNET_API_ERROR_INVALID_SW_IF_INDEX; |