diff options
author | Dave Barach <dave@barachs.net> | 2020-04-29 17:04:10 -0400 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-05-04 14:03:21 +0000 |
commit | 7784140f2bd2d5ae44f2be1507ac25f102006155 (patch) | |
tree | 4ac12e04f5177bffab6f3c05d6bf837567a65988 /src/vpp | |
parent | d88fc0fcedb402e3dc82cb44280d4567a6a13266 (diff) |
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 <dave@barachs.net>
Change-Id: I0157267652a163c01553d5267620f719cc6c3bde
Diffstat (limited to 'src/vpp')
-rw-r--r-- | src/vpp/api/api.c | 2 | ||||
-rw-r--r-- | src/vpp/api/custom_dump.c | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c index 01527a565f3..c3380be0b80 100644 --- a/src/vpp/api/api.c +++ b/src/vpp/api/api.c @@ -221,7 +221,7 @@ vl_api_cli_inband_t_handler (vl_api_cli_inband_t * mp) goto error; } - cmd_vec = vl_api_from_api_to_new_vec (&mp->cmd); + cmd_vec = vl_api_from_api_to_new_vec (mp, &mp->cmd); unformat_init_string (&input, (char *) cmd_vec, vl_api_string_len (&mp->cmd)); diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c index e0ba9f93c3d..edbd3b65e9d 100644 --- a/src/vpp/api/custom_dump.c +++ b/src/vpp/api/custom_dump.c @@ -1799,7 +1799,7 @@ static void *vl_api_sw_interface_dump_t_print if (mp->name_filter_valid) { - u8 *v = vl_api_from_api_to_new_vec (&mp->name_filter); + u8 *v = vl_api_from_api_to_new_vec (mp, &mp->name_filter); s = format (s, "name_filter %v ", v); vec_free (v); } @@ -1858,7 +1858,7 @@ static void *vl_api_cli_inband_t_print u8 *s; u8 *cmd = 0; - cmd = vl_api_from_api_to_new_vec (&mp->cmd); + cmd = vl_api_from_api_to_new_vec (mp, &mp->cmd); s = format (0, "SCRIPT: exec %v ", cmd); |