bfd: fix bfd udp error enum incompatibility 95/37795/2
authorDmitry Valter <d-valter@yandex-team.ru>
Mon, 12 Dec 2022 11:43:33 +0000 (11:43 +0000)
committerDave Wallace <dwallacelf@gmail.com>
Fri, 16 Dec 2022 17:25:27 +0000 (17:25 +0000)
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 <d-valter@yandex-team.ru>
Change-Id: I92fddd26270f946bc16ade840c94e5496e2cb88a

src/vnet/bfd/bfd.api
src/vnet/bfd/bfd_udp.c

index f573bc5..d3b3ed2 100644 (file)
@@ -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;
index 37bb102..2ba43a3 100644 (file)
 #include <vnet/bfd/bfd_api.h>
 #include <vnet/bfd/bfd.api_enum.h>
 
+#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;