From dc3b7883b5f11812785a8561afb5ee33e9f15f69 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 18 Oct 2019 10:14:32 +0700 Subject: [PATCH] syscall: fix wrong unsafe.Pointer alignment in syscall Caught with: go test -a -short -gcflags=all=-d=checkptr log/syslog and: grep -rE '\*\[([^2]|.{2,})\].*\)\(unsafe.Pointer' syscall Updates #34972 Change-Id: Iafd199b3a34beb7cc3e88484bf2fbae45183f951 Reviewed-on: https://go-review.googlesource.com/c/go/+/201877 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/syscall/security_windows.go | 4 +++- src/syscall/syscall_bsd.go | 2 +- src/syscall/syscall_linux.go | 2 +- src/syscall/syscall_solaris.go | 2 +- src/syscall/syscall_windows.go | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/syscall/security_windows.go b/src/syscall/security_windows.go index db80d98a08..e35c4a0c25 100644 --- a/src/syscall/security_windows.go +++ b/src/syscall/security_windows.go @@ -157,13 +157,15 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32, // String converts sid to a string format // suitable for display, storage, or transmission. func (sid *SID) String() (string, error) { + // From https://docs.microsoft.com/en-us/windows/win32/secbiomet/general-constants + const SecurityMaxSidSize = 68 var s *uint16 e := ConvertSidToStringSid(sid, &s) if e != nil { return "", e } defer LocalFree((Handle)(unsafe.Pointer(s))) - return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil + return UTF16ToString((*[SecurityMaxSidSize]uint16)(unsafe.Pointer(s))[:]), nil } // Len returns the length, in bytes, of a valid security identifier sid. diff --git a/src/syscall/syscall_bsd.go b/src/syscall/syscall_bsd.go index 3d04349387..fda9d613d3 100644 --- a/src/syscall/syscall_bsd.go +++ b/src/syscall/syscall_bsd.go @@ -242,7 +242,7 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { break } } - bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go index ed57c93b1f..2eba033d7c 100644 --- a/src/syscall/syscall_linux.go +++ b/src/syscall/syscall_linux.go @@ -484,7 +484,7 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { for n < len(pp.Path) && pp.Path[n] != 0 { n++ } - bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil diff --git a/src/syscall/syscall_solaris.go b/src/syscall/syscall_solaris.go index 425f5122de..daa4b88a71 100644 --- a/src/syscall/syscall_solaris.go +++ b/src/syscall/syscall_solaris.go @@ -293,7 +293,7 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { for n < len(pp.Path) && pp.Path[n] != 0 { n++ } - bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index e4d78d66ad..0be469eef8 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -765,7 +765,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { for n < len(pp.Path) && pp.Path[n] != 0 { n++ } - bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] sa.Name = string(bytes) return sa, nil -- 2.50.0