From 415b6a7c75d003b90d8a7f02563ab41f1b036c21 Mon Sep 17 00:00:00 2001 From: Dmitry Valter Date: Mon, 12 Dec 2022 11:43:33 +0000 Subject: bfd: fix bfd udp error enum incompatibility New BFD UDP errors were no longer compatible with BFD errors. This was causing out-of-bound reads and ASAN test crashes. Fix this issue by statically checking if these enums are compatible. Type: fix Signed-off-by: Dmitry Valter Change-Id: I92fddd26270f946bc16ade840c94e5496e2cb88a --- src/vnet/bfd/bfd.api | 51 ++++++++++++++++++++++++++++++++++++++++++++++---- src/vnet/bfd/bfd_udp.c | 8 ++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/vnet/bfd/bfd.api b/src/vnet/bfd/bfd.api index f573bc5309a..d3b3ed21a26 100644 --- a/src/vnet/bfd/bfd.api +++ b/src/vnet/bfd/bfd.api @@ -359,6 +359,7 @@ autoreply define bfd_udp_auth_deactivate bool is_delayed; }; +/* must be compatible with bfd_error_t */ counters bfd_udp { none { severity info; @@ -366,17 +367,23 @@ counters bfd_udp { units "packets"; description "OK"; }; - no_session { + bad { severity error; type counter64; units "packets"; - description "no-session"; + description "bad packet"; }; - bad { + disabled { severity error; type counter64; units "packets"; - description "bad packet"; + description "bfd packets received on disabled interfaces"; + }; + version { + severity error; + type counter64; + units "packets"; + description "version"; }; length { severity error; @@ -384,6 +391,42 @@ counters bfd_udp { units "packets"; description "too short"; }; + detect_multi { + severity error; + type counter64; + units "packets"; + description "detect-multi"; + }; + multi_point { + severity error; + type counter64; + units "packets"; + description "multi-point"; + }; + my_disc { + severity error; + type counter64; + units "packets"; + description "my-disc"; + }; + your_disc { + severity error; + type counter64; + units "packets"; + description "your-disc"; + }; + admin_down { + severity error; + type counter64; + units "packets"; + description "session admin-down"; + }; + no_session { + severity error; + type counter64; + units "packets"; + description "no-session"; + }; failed_verification { severity error; type counter64; diff --git a/src/vnet/bfd/bfd_udp.c b/src/vnet/bfd/bfd_udp.c index 37bb102d2d9..2ba43a309d1 100644 --- a/src/vnet/bfd/bfd_udp.c +++ b/src/vnet/bfd/bfd_udp.c @@ -42,6 +42,14 @@ #include #include +#define F(sym, str) \ + STATIC_ASSERT ((int) BFD_ERROR_##sym == (int) BFD_UDP_ERROR_##sym, \ + "BFD error enums mismatch"); +foreach_bfd_error (F) +#undef F + STATIC_ASSERT ((int) BFD_N_ERROR <= (int) BFD_UDP_N_ERROR, + "BFD error enum sizes mismatch"); + typedef struct { bfd_main_t *bfd_main; -- cgit 1.2.3-korg