diff options
Diffstat (limited to 'gfx/skia/skia/src/base/SkASAN.h')
-rw-r--r-- | gfx/skia/skia/src/base/SkASAN.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/base/SkASAN.h b/gfx/skia/skia/src/base/SkASAN.h new file mode 100644 index 0000000000..8da93daaa0 --- /dev/null +++ b/gfx/skia/skia/src/base/SkASAN.h @@ -0,0 +1,65 @@ +/* + * Copyright 2020 Google LLC + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkASAN_DEFINED +#define SkASAN_DEFINED + +#include <cstddef> + +#ifdef MOZ_SKIA + +#include "mozilla/MemoryChecking.h" + +#ifdef MOZ_HAVE_MEM_CHECKS +#define SK_SANITIZE_ADDRESS MOZ_HAVE_MEM_CHECKS +#endif + +static inline void sk_asan_poison_memory_region(void const volatile *addr, size_t size) { + MOZ_MAKE_MEM_NOACCESS(addr, size); +} + +static inline void sk_asan_unpoison_memory_region(void const volatile *addr, size_t size) { + MOZ_MAKE_MEM_DEFINED(addr, size); +} + +#else // !MOZ_SKIA + +#ifdef __SANITIZE_ADDRESS__ + #define SK_SANITIZE_ADDRESS 1 +#endif +#if !defined(SK_SANITIZE_ADDRESS) && defined(__has_feature) + #if __has_feature(address_sanitizer) + #define SK_SANITIZE_ADDRESS 1 + #endif +#endif + +// Typically declared in LLVM's asan_interface.h. +#ifdef SK_SANITIZE_ADDRESS +extern "C" { + void __asan_poison_memory_region(void const volatile *addr, size_t size); + void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +} +#endif + +// Code that implements bespoke allocation arenas can poison the entire arena on creation, then +// unpoison chunks of arena memory as they are parceled out. Consider leaving gaps between blocks +// to detect buffer overrun. +static inline void sk_asan_poison_memory_region(void const volatile *addr, size_t size) { +#ifdef SK_SANITIZE_ADDRESS + __asan_poison_memory_region(addr, size); +#endif +} + +static inline void sk_asan_unpoison_memory_region(void const volatile *addr, size_t size) { +#ifdef SK_SANITIZE_ADDRESS + __asan_unpoison_memory_region(addr, size); +#endif +} + +#endif // !MOZ_SKIA + +#endif // SkASAN_DEFINED |