Don't sanitize linker_set

The assumptions of linker_set don't play nicely with
AddressSanitizer. AddressSanitizer adds a 'redzone' of zeros around
globals (including those in named sections), whereas linker_set
assumes they are all packed consecutively like a pointer array. So:
let's annotate linker_set so that AddressSanitizer ignores it.

Submitted by:	Matthew Bryan <matthew.bryan@isilon.com>
Reviewed by:	kib, rang_acm.org
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D22239
This commit is contained in:
David Bright 2019-11-19 14:46:28 +00:00
parent 5008941522
commit fe3d8086fb
2 changed files with 8 additions and 0 deletions

View file

@ -872,6 +872,13 @@
/* Function should not be analyzed. */ /* Function should not be analyzed. */
#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis) #define __no_lock_analysis __lock_annotate(no_thread_safety_analysis)
/* Function or variable should not be sanitized, ie. by AddressSanitizer */
#if __has_attribute(no_sanitize)
#define __nosanitizeaddress __attribute__((no_sanitize("address")))
#else
#define __nosanitizeaddress
#endif
/* Guard variables and structure members by lock. */ /* Guard variables and structure members by lock. */
#define __guarded_by(x) __lock_annotate(guarded_by(x)) #define __guarded_by(x) __lock_annotate(guarded_by(x))
#define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x)) #define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x))

View file

@ -61,6 +61,7 @@
__GLOBL(__CONCAT(__stop_set_,set)); \ __GLOBL(__CONCAT(__stop_set_,set)); \
static void const * qv \ static void const * qv \
__set_##set##_sym_##sym __section("set_" #set) \ __set_##set##_sym_##sym __section("set_" #set) \
__nosanitizeaddress \
__used = &(sym) __used = &(sym)
#define __MAKE_SET(set, sym) __MAKE_SET_QV(set, sym, __MAKE_SET_CONST) #define __MAKE_SET(set, sym) __MAKE_SET_QV(set, sym, __MAKE_SET_CONST)
#else /* !__GNUCLIKE___SECTION */ #else /* !__GNUCLIKE___SECTION */