From 727590c5006e77ca5247972f47e877f4929fc985 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 18 Oct 2019 09:22:11 +0200 Subject: [PATCH] unix: avoid "just past the end" pointers in UnixRights Same as CL 201617 did for package syscall. Caught with -d=checkptr Updates golang/go#22218 Change-Id: I8208f8e6d9bd62376bf9e0458dc18956daabd785 Reviewed-on: https://go-review.googlesource.com/c/sys/+/201937 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Elias Naur --- unix/sockcmsg_linux.go | 2 +- unix/sockcmsg_unix.go | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/unix/sockcmsg_linux.go b/unix/sockcmsg_linux.go index 6079eb4a..8bf45705 100644 --- a/unix/sockcmsg_linux.go +++ b/unix/sockcmsg_linux.go @@ -17,7 +17,7 @@ func UnixCredentials(ucred *Ucred) []byte { h.Level = SOL_SOCKET h.Type = SCM_CREDENTIALS h.SetLen(CmsgLen(SizeofUcred)) - *((*Ucred)(cmsgData(h))) = *ucred + *(*Ucred)(h.data(0)) = *ucred return b } diff --git a/unix/sockcmsg_unix.go b/unix/sockcmsg_unix.go index 062bcaba..1614dc67 100644 --- a/unix/sockcmsg_unix.go +++ b/unix/sockcmsg_unix.go @@ -50,8 +50,8 @@ func CmsgSpace(datalen int) int { return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen) } -func cmsgData(h *Cmsghdr) unsafe.Pointer { - return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr))) +func (h *Cmsghdr) data(offset uintptr) unsafe.Pointer { + return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)) + offset) } // SocketControlMessage represents a socket control message. @@ -94,10 +94,8 @@ func UnixRights(fds ...int) []byte { h.Level = SOL_SOCKET h.Type = SCM_RIGHTS h.SetLen(CmsgLen(datalen)) - data := cmsgData(h) - for _, fd := range fds { - *(*int32)(data) = int32(fd) - data = unsafe.Pointer(uintptr(data) + 4) + for i, fd := range fds { + *(*int32)(h.data(4 * uintptr(i))) = int32(fd) } return b }