]> Cypherpunks repositories - gostls13.git/commitdiff
internal/syscall/windows: change WSAMsg.Name type
authorAlex Brainman <alex.brainman@gmail.com>
Sat, 7 Mar 2020 00:08:06 +0000 (11:08 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 2 Apr 2020 09:00:44 +0000 (09:00 +0000)
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>
src/internal/poll/fd_windows.go
src/internal/syscall/windows/syscall_windows.go

index 4b2623ea8f2ea13f58bd3885ecd2fe7bfcbc4da1..1a0bdb34fec571b371dbdcdc8626feb3c29267cf 100644 (file)
@@ -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 {
index dc641116baef421b2fa43c0455ca701ae0284041..f299adc45f3ba4bed17a3f5ce91bb126131277a9 100644 (file)
@@ -176,7 +176,7 @@ var sendRecvMsgFunc struct {
 }
 
 type WSAMsg struct {
-       Name        *syscall.RawSockaddrAny
+       Name        syscall.Pointer
        Namelen     int32
        Buffers     *syscall.WSABuf
        BufferCount uint32