]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: disable ASAN redzone around xref_p/xref_array
authorDavid Lamparter <equinox@diac24.net>
Thu, 15 Apr 2021 04:26:45 +0000 (06:26 +0200)
committerDavid Lamparter <equinox@diac24.net>
Thu, 15 Apr 2021 04:27:34 +0000 (06:27 +0200)
The "xref_p" variables are placed in the "xref_array" section
specifically so they're next to each other and we get an array at the
end.  The ASAN redzone that is inserted around global variables is
breaks that since it'd be inserted before and after each of the array
items.  So disable the ASAN redzone for these variables (and only these
variables, nothing else should be affected.)

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/xref.h

index b1cb172b410d3e260a535a70ce9b03c43b7b0549..63166b069a3811502363a1dd869197003fa9dec3 100644 (file)
@@ -137,6 +137,19 @@ extern void xref_gcc_workaround(const struct xref *xref);
 extern const struct xref * const __start_xref_array[1] DSO_LOCAL;
 extern const struct xref * const __stop_xref_array[1] DSO_LOCAL;
 
+#if defined(__has_feature)
+#if __has_feature(address_sanitizer)
+/* no redzone around each of the xref_p please, we're building an array out
+ * of variables here.  kinda breaks things if there's redzones between each
+ * array item.
+ */
+#define xref_array_attr used, section("xref_array"), no_sanitize("address")
+#endif
+#endif
+#ifndef xref_array_attr
+#define xref_array_attr used, section("xref_array")
+#endif
+
 /* this macro is invoked once for each standalone DSO through
  *   FRR_MODULE_SETUP  \
  *                      }-> FRR_COREMOD_SETUP -> XREF_SETUP
@@ -151,8 +164,7 @@ extern const struct xref * const __stop_xref_array[1] DSO_LOCAL;
                        /* .func = */ "dummy",                                 \
        };                                                                     \
        static const struct xref * const _dummy_xref_p                         \
-                       __attribute__((used, section("xref_array")))           \
-                       = &_dummy_xref;                                        \
+                       __attribute__((xref_array_attr)) = &_dummy_xref;       \
        static void __attribute__((used, _CONSTRUCTOR(1100)))                  \
                        _xref_init(void) {                                     \
                static struct xref_block _xref_block = {                       \
@@ -225,7 +237,7 @@ extern const struct xref * const __stop_xref_array[1] DSO_LOCAL;
 #if defined(__clang__) || !defined(__cplusplus)
 #define XREF_LINK(dst)                                                         \
        static const struct xref * const NAMECTR(xref_p_)                      \
-                       __attribute__((used, section("xref_array")))           \
+                       __attribute__((xref_array_attr))                       \
                = &(dst)                                                       \
        /* end */