Module Name: src Committed By: maxv Date: Fri Apr 3 18:12:39 UTC 2020
Modified Files: src/sys/arch/amd64/conf: Makefile.amd64 src/sys/kern: subr_asan.c Log Message: Add KASAN instrumentation on on-stack VLAs. To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 src/sys/arch/amd64/conf/Makefile.amd64 cvs rdiff -u -r1.18 -r1.19 src/sys/kern/subr_asan.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/conf/Makefile.amd64 diff -u src/sys/arch/amd64/conf/Makefile.amd64:1.80 src/sys/arch/amd64/conf/Makefile.amd64:1.81 --- src/sys/arch/amd64/conf/Makefile.amd64:1.80 Thu Nov 14 16:23:52 2019 +++ src/sys/arch/amd64/conf/Makefile.amd64 Fri Apr 3 18:12:39 2020 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.amd64,v 1.80 2019/11/14 16:23:52 maxv Exp $ +# $NetBSD: Makefile.amd64,v 1.81 2020/04/03 18:12:39 maxv Exp $ # Makefile for NetBSD # @@ -52,6 +52,7 @@ CFLAGS+= -mindirect-branch-register .if ${KASAN:U0} > 0 && ${HAVE_GCC:U0} > 0 KASANFLAGS= -fsanitize=kernel-address \ --param asan-globals=1 --param asan-stack=1 \ + --param asan-instrument-allocas=1 \ -fsanitize-address-use-after-scope \ -fasan-shadow-offset=0xDFFF900000000000 .for f in subr_asan.c subr_kcov.c subr_lwp_specificdata.c subr_specificdata.c Index: src/sys/kern/subr_asan.c diff -u src/sys/kern/subr_asan.c:1.18 src/sys/kern/subr_asan.c:1.19 --- src/sys/kern/subr_asan.c:1.18 Sat Feb 8 09:05:08 2020 +++ src/sys/kern/subr_asan.c Fri Apr 3 18:12:39 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_asan.c,v 1.18 2020/02/08 09:05:08 maxv Exp $ */ +/* $NetBSD: subr_asan.c,v 1.19 2020/04/03 18:12:39 maxv Exp $ */ /* * Copyright (c) 2018-2020 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.18 2020/02/08 09:05:08 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.19 2020/04/03 18:12:39 maxv Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_asan.c, #define KASAN_SHADOW_SCALE_SHIFT 3 #define KASAN_SHADOW_SCALE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT) #define KASAN_SHADOW_MASK (KASAN_SHADOW_SCALE_SIZE - 1) +#define KASAN_ALLOCA_SCALE_SIZE 32 /* The MD code. */ #include <machine/asan.h> @@ -1247,3 +1248,34 @@ __asan_unpoison_stack_memory(const void { kasan_shadow_Nbyte_markvalid(addr, size); } + +void __asan_alloca_poison(const void *, size_t); +void __asan_allocas_unpoison(const void *, const void *); + +void __asan_alloca_poison(const void *addr, size_t size) +{ + const void *l, *r; + + KASSERT((vaddr_t)addr % KASAN_ALLOCA_SCALE_SIZE == 0); + + l = (const uint8_t *)addr - KASAN_ALLOCA_SCALE_SIZE; + r = (const uint8_t *)addr + roundup(size, KASAN_ALLOCA_SCALE_SIZE); + + kasan_shadow_Nbyte_fill(l, KASAN_ALLOCA_SCALE_SIZE, KASAN_STACK_LEFT); + kasan_mark(addr, size, roundup(size, KASAN_ALLOCA_SCALE_SIZE), + KASAN_STACK_MID); + kasan_shadow_Nbyte_fill(r, KASAN_ALLOCA_SCALE_SIZE, KASAN_STACK_RIGHT); +} + +void __asan_allocas_unpoison(const void *stkbegin, const void *stkend) +{ + size_t size; + + if (__predict_false(!stkbegin)) + return; + if (__predict_false((uintptr_t)stkbegin > (uintptr_t)stkend)) + return; + size = (uintptr_t)stkend - (uintptr_t)stkbegin; + + kasan_shadow_Nbyte_fill(stkbegin, size, 0); +}