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);
+}

Reply via email to