From 2e1a6a28dfcc57ad6a14c9c27a81ee37b9b6f874 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 19 Oct 2019 15:18:34 +0700 Subject: [PATCH] runtime: fix unsafe.Pointer alignment on Linux Caught by go test -a -short -gcflags=all=-d=checkptr runtime TestMincoreErrorSign intentionally uses uintptr(1) to get -EINVAL, but it violates unsafe pointer rules 2. So use another misaligned pointer add(new(int32), 1), but do not violate unsafe pointer rules. TestEpollctlErrorSign passes an unsafe.Pointer of &struct{}{} to Epollctl, which is then casted to epollevent, causes mis-alignment. Fixing it by exporting epollevent on runtime_test package, so it can be passed to Epollctl. Updates #34972 Change-Id: I78ebfbeaf706fd1d372272af0bbc4e2cabca4631 Reviewed-on: https://go-review.googlesource.com/c/go/+/202157 Run-TryBot: Cuong Manh Le Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/runtime/export_linux_test.go | 3 +++ src/runtime/runtime_linux_test.go | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/runtime/export_linux_test.go b/src/runtime/export_linux_test.go index c73f2f33d1..b7c901f238 100644 --- a/src/runtime/export_linux_test.go +++ b/src/runtime/export_linux_test.go @@ -10,6 +10,9 @@ import "unsafe" var NewOSProc0 = newosproc0 var Mincore = mincore +var Add = add + +type EpollEvent epollevent func Epollctl(epfd, op, fd int32, ev unsafe.Pointer) int32 { return epollctl(epfd, op, fd, (*epollevent)(ev)) diff --git a/src/runtime/runtime_linux_test.go b/src/runtime/runtime_linux_test.go index 17d6fbde46..cd59368cb2 100644 --- a/src/runtime/runtime_linux_test.go +++ b/src/runtime/runtime_linux_test.go @@ -41,11 +41,11 @@ func TestLockOSThread(t *testing.T) { } } -// Test that error values are negative. Use address 1 (a misaligned -// pointer) to get -EINVAL. +// Test that error values are negative. +// Use a misaligned pointer to get -EINVAL. func TestMincoreErrorSign(t *testing.T) { var dst byte - v := Mincore(unsafe.Pointer(uintptr(1)), 1, &dst) + v := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst) const EINVAL = 0x16 if v != -EINVAL { @@ -54,7 +54,7 @@ func TestMincoreErrorSign(t *testing.T) { } func TestEpollctlErrorSign(t *testing.T) { - v := Epollctl(-1, 1, -1, unsafe.Pointer(&struct{}{})) + v := Epollctl(-1, 1, -1, unsafe.Pointer(&EpollEvent{})) const EBADF = 0x09 if v != -EBADF { -- 2.50.0