Module Name:    src
Committed By:   maxv
Date:           Sun Feb 24 08:02:45 UTC 2019

Modified Files:
        src/sys/arch/amd64/conf: Makefile.amd64
        src/sys/kern: subr_asan.c

Log Message:
Add support for use-after-scope detection in KASAN. It is available since
GCC7, and we have GCC7 by default now.

Slightly reorder the code, and remove a duplicated KASSERT too.

Tested on amd64-KASAN. Not yet enabled on aarch64-KASAN, but it should
work as-is.


To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/arch/amd64/conf/Makefile.amd64
cvs rdiff -u -r1.3 -r1.4 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.75 src/sys/arch/amd64/conf/Makefile.amd64:1.76
--- src/sys/arch/amd64/conf/Makefile.amd64:1.75	Wed Oct 31 06:26:25 2018
+++ src/sys/arch/amd64/conf/Makefile.amd64	Sun Feb 24 08:02:45 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.amd64,v 1.75 2018/10/31 06:26:25 maxv Exp $
+#	$NetBSD: Makefile.amd64,v 1.76 2019/02/24 08:02:45 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 \
+		-fsanitize-address-use-after-scope \
 		-fasan-shadow-offset=0xDFFF900000000000
 .for f in subr_asan.c
 KASANFLAGS.${f}=	# empty

Index: src/sys/kern/subr_asan.c
diff -u src/sys/kern/subr_asan.c:1.3 src/sys/kern/subr_asan.c:1.4
--- src/sys/kern/subr_asan.c:1.3	Wed Feb 13 14:55:29 2019
+++ src/sys/kern/subr_asan.c	Sun Feb 24 08:02:45 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_asan.c,v 1.3 2019/02/13 14:55:29 kamil Exp $	*/
+/*	$NetBSD: subr_asan.c,v 1.4 2019/02/24 08:02:45 maxv Exp $	*/
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.3 2019/02/13 14:55:29 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_asan.c,v 1.4 2019/02/24 08:02:45 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -182,6 +182,16 @@ kasan_shadow_1byte_markvalid(unsigned lo
 }
 
 static __always_inline void
+kasan_shadow_Nbyte_markvalid(const void *addr, size_t size)
+{
+	size_t i;
+
+	for (i = 0; i < size; i++) {
+		kasan_shadow_1byte_markvalid((unsigned long)addr+i);
+	}
+}
+
+static __always_inline void
 kasan_shadow_Nbyte_fill(const void *addr, size_t size, uint8_t val)
 {
 	void *shad;
@@ -210,16 +220,10 @@ kasan_add_redzone(size_t *size)
 static void
 kasan_markmem(const void *addr, size_t size, bool valid)
 {
-	size_t i;
-
 	KASSERT((vaddr_t)addr % KASAN_SHADOW_SCALE_SIZE == 0);
-
 	if (valid) {
-		for (i = 0; i < size; i++) {
-			kasan_shadow_1byte_markvalid((unsigned long)addr+i);
-		}
+		kasan_shadow_Nbyte_markvalid(addr, size);
 	} else {
-		KASSERT(size % KASAN_SHADOW_SCALE_SIZE == 0);
 		kasan_shadow_Nbyte_fill(addr, size, KASAN_MEMORY_REDZONE);
 	}
 }
@@ -537,3 +541,17 @@ ASAN_SET_SHADOW(f2);
 ASAN_SET_SHADOW(f3);
 ASAN_SET_SHADOW(f5);
 ASAN_SET_SHADOW(f8);
+
+void __asan_poison_stack_memory(const void *, size_t);
+void __asan_unpoison_stack_memory(const void *, size_t);
+
+void __asan_poison_stack_memory(const void *addr, size_t size)
+{
+	size = roundup(size, KASAN_SHADOW_SCALE_SIZE);
+	kasan_shadow_Nbyte_fill(addr, size, KASAN_USE_AFTER_SCOPE);
+}
+
+void __asan_unpoison_stack_memory(const void *addr, size_t size)
+{
+	kasan_shadow_Nbyte_markvalid(addr, size);
+}

Reply via email to