]> Cypherpunks.ru repositories - gostls13.git/commitdiff
src/runtime: mark asanread and asanwrite functions as NOSPLIT
authorfanzha02 <fannie.zhang@arm.com>
Thu, 30 Dec 2021 03:09:42 +0000 (11:09 +0800)
committerFannie Zhang <Fannie.Zhang@arm.com>
Wed, 5 Jan 2022 09:50:29 +0000 (09:50 +0000)
The asan runtime functions may run on stacks that cannot grow, and
they do not have large local variables, so it is safe to mark them
as NOSPLIT.

Add test case.

Fixes #50391

Change-Id: Iadcbf1ae0c837d9b64da5be208c7f424e6ba11de
Reviewed-on: https://go-review.googlesource.com/c/go/+/374398
Trust: Emmanuel Odeke <emmanuel@orijtech.com>
Trust: Fannie Zhang <Fannie.Zhang@arm.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
misc/cgo/testsanitizers/asan_test.go
misc/cgo/testsanitizers/testdata/asan5_fail.go [new file with mode: 0644]
src/runtime/asan.go

index 27bd8a5b1f37aef7eaffe3d615991344a0bc19c0..1b70bce3d1183f8db7de1b9bddbf90385b22f5e8 100644 (file)
@@ -39,6 +39,7 @@ func TestASAN(t *testing.T) {
                {src: "asan2_fail.go", memoryAccessError: "heap-buffer-overflow", errorLocation: "asan2_fail.go:31"},
                {src: "asan3_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan3_fail.go:13"},
                {src: "asan4_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan4_fail.go:13"},
+               {src: "asan5_fail.go", memoryAccessError: "use-after-poison", errorLocation: "asan5_fail.go:18"},
                {src: "asan_useAfterReturn.go"},
        }
        for _, tc := range cases {
diff --git a/misc/cgo/testsanitizers/testdata/asan5_fail.go b/misc/cgo/testsanitizers/testdata/asan5_fail.go
new file mode 100644 (file)
index 0000000..d6853ea
--- /dev/null
@@ -0,0 +1,21 @@
+package main
+
+import (
+       "fmt"
+       "runtime"
+       "unsafe"
+)
+
+func main() {
+       p := new([1024 * 1000]int)
+       p[0] = 10
+       r := bar(&p[1024*1000-1])
+       fmt.Printf("r value is %d", r)
+}
+
+func bar(a *int) int {
+       p := unsafe.Add(unsafe.Pointer(a), 2*unsafe.Sizeof(int(1)))
+       runtime.ASanWrite(p, 8) // BOOM
+       *((*int)(p)) = 10
+       return *((*int)(p))
+}
index affafd4d8df797ce248e9fbde7038381cf6e9443..26656cd975c2a6b0a645f439fa5b3f7ad297ad72 100644 (file)
@@ -26,12 +26,16 @@ func ASanWrite(addr unsafe.Pointer, len int) {
 // Private interface for the runtime.
 const asanenabled = true
 
+// Mark asan(read, write) as NOSPLIT, because they may run
+// on stacks that cannot grow. See issue #50391.
+//go:nosplit
 func asanread(addr unsafe.Pointer, sz uintptr) {
        sp := getcallersp()
        pc := getcallerpc()
        doasanread(addr, sz, sp, pc)
 }
 
+//go:nosplit
 func asanwrite(addr unsafe.Pointer, sz uintptr) {
        sp := getcallersp()
        pc := getcallerpc()