diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2020-03-07 11:08:06 +1100 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2020-04-02 09:00:44 +0000 |
commit | 801cd7c84d42dcf18256416524aa0d31d6305830 (patch) | |
tree | 271c9cf4af3a2cd45341d44a0e18c2ccfe129e3d | |
parent | 9667294d8f5c8c6e2c48efa1ced98cb7e9cfaf51 (diff) | |
download | go-801cd7c84d42dcf18256416524aa0d31d6305830.tar.gz go-801cd7c84d42dcf18256416524aa0d31d6305830.zip |
internal/syscall/windows: change WSAMsg.Name type
The problem was discovered while running
go test -a -short -gcflags=all=-d=checkptr -run=TestUDPConnSpecificMethods net
WSAMsg is type defined by Windows. And WSAMsg.Name could point to two
different structures for IPv4 and IPV6 sockets.
Currently WSAMsg.Name is declared as *syscall.RawSockaddrAny. But that
violates
(1) Conversion of a *T1 to Pointer to *T2.
rule of
https://golang.org/pkg/unsafe/#Pointer
When we convert *syscall.RawSockaddrInet4 into *syscall.RawSockaddrAny,
syscall.RawSockaddrInet4 and syscall.RawSockaddrAny do not share an
equivalent memory layout.
Same for *syscall.SockaddrInet6 into *syscall.RawSockaddrAny.
This CL changes WSAMsg.Name type to *syscall.Pointer. syscall.Pointer
length is 0, and that at least makes type checker happy.
After this change I was able to run
go test -a -short -gcflags=all=-d=checkptr std cmd
without type checker complaining.
Updates #34972
Change-Id: Ic5c2321c20abd805c687ee16ef6f643a2f8cd93f
Reviewed-on: https://go-review.googlesource.com/c/go/+/222457
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r-- | src/internal/poll/fd_windows.go | 4 | ||||
-rw-r--r-- | src/internal/syscall/windows/syscall_windows.go | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index 4b2623ea8f..1a0bdb34fe 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -999,7 +999,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte) (int, int, int, syscall.Sockaddr, er o := &fd.rop o.InitMsg(p, oob) o.rsa = new(syscall.RawSockaddrAny) - o.msg.Name = o.rsa + o.msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa)) o.msg.Namelen = int32(unsafe.Sizeof(*o.rsa)) n, err := execIO(o, func(o *operation) error { return windows.WSARecvMsg(o.fd.Sysfd, &o.msg, &o.qty, &o.o, nil) @@ -1030,7 +1030,7 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err if err != nil { return 0, 0, err } - o.msg.Name = (*syscall.RawSockaddrAny)(rsa) + o.msg.Name = (syscall.Pointer)(rsa) o.msg.Namelen = len } n, err := execIO(o, func(o *operation) error { diff --git a/src/internal/syscall/windows/syscall_windows.go b/src/internal/syscall/windows/syscall_windows.go index dc641116ba..f299adc45f 100644 --- a/src/internal/syscall/windows/syscall_windows.go +++ b/src/internal/syscall/windows/syscall_windows.go @@ -176,7 +176,7 @@ var sendRecvMsgFunc struct { } type WSAMsg struct { - Name *syscall.RawSockaddrAny + Name syscall.Pointer Namelen int32 Buffers *syscall.WSABuf BufferCount uint32 |