From 7784140f2bd2d5ae44f2be1507ac25f102006155 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Wed, 29 Apr 2020 17:04:10 -0400 Subject: misc: binary api fuzz test fixes Add a hook to src/vlibapi/api_shared.c to fuzz (screw up) binary API messages, e.g. by xoring random data into them before processing. We specifically exempt client connection messages, and inband debug CLI messages. We step over msg_id, client index, client context, and sw_if_index. Otherwise, "make test" vectors fail too rapidly to learn anything. The goal is to reduce the number of crashes caused to zero. We're fairly close with this patch. Add vl_msg_api_max_length(void *mp), which returns the maximum plausible length for a binary API message. Use it to hardern vl_api_from_api_to_new_vec(...) which takes an additional argument - message pointer - so it can verify that astr->length is sane. If it's not sane, return a u8 *vector of the form "insane astr->length nnnn\0". Verify array lengths in vl_api_dhcp6_send_client_message_t_handler(...) and vl_api_dhcp6_pd_send_client_message_t_handler(...). Add a fairly effective binary API fuzz hook to the unittest plugin, and modify the "make test" framework.py to pass "api-fuzz { on|off }" to enable API fuzzing: "make API_FUZZ=on TEST=xxx test-debug" or similar Type: improvement Signed-off-by: Dave Barach Change-Id: I0157267652a163c01553d5267620f719cc6c3bde --- src/plugins/ioam/lib-pot/pot_api.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/plugins/ioam') diff --git a/src/plugins/ioam/lib-pot/pot_api.c b/src/plugins/ioam/lib-pot/pot_api.c index 31ddf9da528..72d05d76590 100644 --- a/src/plugins/ioam/lib-pot/pot_api.c +++ b/src/plugins/ioam/lib-pot/pot_api.c @@ -14,7 +14,7 @@ */ /* *------------------------------------------------------------------ - * pot_api.c - Proof of Transit related APIs to create + * pot_api.c - Proof of Transit related APIs to create * and maintain profiles *------------------------------------------------------------------ */ @@ -43,7 +43,7 @@ static void vl_api_pot_profile_add_t_handler pot_profile *profile = NULL; u8 *name = 0; - name = vl_api_from_api_to_new_vec(&mp->list_name); + name = vl_api_from_api_to_new_vec(mp, &mp->list_name); pot_profile_list_init(name); id = mp->id; @@ -61,7 +61,7 @@ static void vl_api_pot_profile_add_t_handler (void)pot_profile_set_bit_mask(profile, mp->max_bits); } else { rv = -3; - } + } ERROROUT: vec_free(name); REPLY_MACRO(VL_API_POT_PROFILE_ADD_REPLY); @@ -121,14 +121,14 @@ static void vl_api_pot_profile_activate_t_handler u8 id; u8 *name = NULL; - name = vl_api_from_api_to_new_vec(&mp->list_name); + name = vl_api_from_api_to_new_vec(mp, &mp->list_name); if (!pot_profile_list_is_enabled(name)) { rv = -1; } else { id = mp->id; rv = pot_profile_set_active(id); } - + vec_free(name); REPLY_MACRO(VL_API_POT_PROFILE_ACTIVATE_REPLY); } -- cgit 1.2.3-korg