Skip to content

Address sanitization

include/mem/asan.h View source View on GitHub
bool asan_shadow_is_poison(uint8_t s)
source
void asan_init(void)
source
enum err asan_shadow_install(vaddr_t base, size_t len)
source

Shadow backing at the slab chunk granularity, which must happen before any object in the chunk is handed off

void asan_shadow_release(vaddr_t base, size_t len)
source
void asan_alloc(void *addr, size_t requested, size_t slot)
source
void asan_free(void *addr, size_t slot)
source
void asan_poison(void *addr, size_t size)
source
void asan_unpoison(void *addr, size_t size)
source
void asan_init(void)
source
enum err asan_shadow_install(vaddr_t base, size_t len)
source
void asan_shadow_release(vaddr_t base, size_t len)
source
void asan_alloc(void *addr, size_t requested, size_t slot)
source
void asan_free(void *addr, size_t slot)
source
void asan_poison(void *addr, size_t size)
source
void asan_unpoison(void *addr, size_t size)
source
LOG_SITE_EXTERN(asan) (1 declaration) source
§ struct log_site __log_site_asan
LOG_HANDLE_EXTERN(asan) (1 declaration) source
§ struct log_handle __log_handle_asan
#define ASAN_SHADOW_SCALE 3ULL
source

1 shadow byte per 8 real bytes

#define ASAN_SHADOW_OFFSET 0xDFFFFE0000000000
source
#define ASAN_SHADOW_ADDR(a)
source

offset = SHADOW_REGION_START - (COVERED_START >> SHADOW_SCALE) shadow = (addr >> scale) + offset

Expansion
#define ASAN_SHADOW_ADDR(a) \
    ((uintptr_t) (((uintptr_t) (a) >> ASAN_SHADOW_SCALE) + ASAN_SHADOW_OFFSET))
#define ASAN_GRANULE ((uintptr_t) BIT(ASAN_SHADOW_SCALE))
source
#define ASAN_REDZONE 16
source

optional redzone per allocation

#define ASAN_POISON_VALUE 0xFF
source

Shadow byte encoding, one per ASAN_GRANULE bytes of memory:

0 - whole granule accessible 1..7 first k bytes accessible >= 0x80 nothing in granule accessible

generic: never handed out

#define ASAN_POISON_HEAP_REDZONE 0xFA
source

slack around/inside a live slot

#define ASAN_POISON_HEAP_FREED 0xFD
source

was live, has been freed

#define ASAN_ABORT_IF_NOT_READY()
source
Expansion
#define ASAN_ABORT_IF_NOT_READY() \
    do { \
        if (!asan_ready) \
            return; \
    } while (0)
#define asan_log(lvl, fmt, ...)
source
Expansion
#define asan_log(lvl, fmt, ...) \
    log(LOG_SITE(asan), LOG_HANDLE(asan), lvl, fmt, ##__VA_ARGS__)
#define asan_err(fmt, ...)
source
Expansion
#define asan_err(fmt, ...) asan_log(LOG_ERROR, fmt, ##__VA_ARGS__)
#define asan_warn(fmt, ...)
source
Expansion
#define asan_warn(fmt, ...) asan_log(LOG_WARN, fmt, ##__VA_ARGS__)
#define asan_info(fmt, ...)
source
Expansion
#define asan_info(fmt, ...) asan_log(LOG_INFO, fmt, ##__VA_ARGS__)
#define asan_debug(fmt, ...)
source
Expansion
#define asan_debug(fmt, ...) asan_log(LOG_DEBUG, fmt, ##__VA_ARGS__)
#define asan_trace(fmt, ...)
source
Expansion
#define asan_trace(fmt, ...) asan_log(LOG_TRACE, fmt, ##__VA_ARGS__)