]> Cypherpunks repositories - gostls13.git/commitdiff
net: allow zero value destination address in WriteMsgUDPAddrPort
authordatabase64128 <free122448@hotmail.com>
Fri, 1 Aug 2025 16:42:27 +0000 (00:42 +0800)
committerSean Liao <sean@liao.dev>
Wed, 27 Aug 2025 08:05:25 +0000 (01:05 -0700)
The existing address validity checks already cover both connected and
non-connected sockets. Pass a nil sockaddr just like WriteMsgUDP, when
the address is zero value.

TestWriteToUDP is extended to cover the netip APIs.

Fixes #74841

Change-Id: I2708e7747e224958198fe7abb3fcd8d59bc5a88a
Reviewed-on: https://go-review.googlesource.com/c/go/+/692437
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Sean Liao <sean@liao.dev>
Reviewed-by: Damien Neil <dneil@google.com>
src/net/ipsock_posix.go
src/net/net_fake.go
src/net/udpsock_posix.go
src/net/udpsock_test.go

index 52712f932f7530e8f62cb41cccffc994d4e9b7be..1ed37d7e6eaf251968a931e6f93443b76ea833ed 100644 (file)
@@ -260,9 +260,6 @@ func addrPortToSockaddrInet6(ap netip.AddrPort) (syscall.SockaddrInet6, error) {
        // to an IPv4-mapped IPv6 address.
        // The error message is kept consistent with ipToSockaddrInet6.
        addr := ap.Addr()
-       if !addr.IsValid() {
-               return syscall.SockaddrInet6{}, &AddrError{Err: "non-IPv6 address", Addr: addr.String()}
-       }
        sa := syscall.SockaddrInet6{
                Addr:   addr.As16(),
                Port:   int(ap.Port()),
index f7eb28e01ac37dfc72b53470cf449135294d4cae..cc35d90a26742fc3cd248f1cf2e96260ecbf7f45 100644 (file)
@@ -1082,11 +1082,19 @@ func (ffd *fakeNetFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int
        return n, 0, err
 }
 
-func (ffd *fakeNetFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
+func (ffd *fakeNetFD) writeMsgInet4(p []byte, oob []byte, sa4 *syscall.SockaddrInet4) (n int, oobn int, err error) {
+       var sa syscall.Sockaddr
+       if sa4 != nil {
+               sa = sa4
+       }
        return ffd.writeMsg(p, oob, sa)
 }
 
-func (ffd *fakeNetFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
+func (ffd *fakeNetFD) writeMsgInet6(p []byte, oob []byte, sa6 *syscall.SockaddrInet6) (n int, oobn int, err error) {
+       var sa syscall.Sockaddr
+       if sa6 != nil {
+               sa = sa6
+       }
        return ffd.writeMsg(p, oob, sa)
 }
 
index 3cd1d0a7624165b7cc7a09f9c21d78cac9219ad7..99e4359e719d347f94cab5fd942e6251609b3985 100644 (file)
@@ -186,17 +186,25 @@ func (c *UDPConn) writeMsgAddrPort(b, oob []byte, addr netip.AddrPort) (n, oobn
 
        switch c.fd.family {
        case syscall.AF_INET:
-               sa, err := addrPortToSockaddrInet4(addr)
-               if err != nil {
-                       return 0, 0, err
+               var sap *syscall.SockaddrInet4
+               if addr.IsValid() {
+                       sa, err := addrPortToSockaddrInet4(addr)
+                       if err != nil {
+                               return 0, 0, err
+                       }
+                       sap = &sa
                }
-               return c.fd.writeMsgInet4(b, oob, &sa)
+               return c.fd.writeMsgInet4(b, oob, sap)
        case syscall.AF_INET6:
-               sa, err := addrPortToSockaddrInet6(addr)
-               if err != nil {
-                       return 0, 0, err
+               var sap *syscall.SockaddrInet6
+               if addr.IsValid() {
+                       sa, err := addrPortToSockaddrInet6(addr)
+                       if err != nil {
+                               return 0, 0, err
+                       }
+                       sap = &sa
                }
-               return c.fd.writeMsgInet6(b, oob, &sa)
+               return c.fd.writeMsgInet6(b, oob, sap)
        default:
                return 0, 0, &AddrError{Err: "invalid address family", Addr: addr.Addr().String()}
        }
index 3c8da43bdd9b61ef87bcf9fa8bfedb5db83d89dc..7b4bf328e28f9bc4b71ae0163902bc2269efaeec 100644 (file)
@@ -141,36 +141,37 @@ func testWriteToConn(t *testing.T, raddr string) {
        if err != nil {
                t.Fatal(err)
        }
+       rap := ra.AddrPort()
+
+       assertErrWriteToConnected := func(t *testing.T, err error) {
+               t.Helper()
+               if e, ok := err.(*OpError); !ok || e.Err != ErrWriteToConnected {
+                       t.Errorf("got %v; want ErrWriteToConnected", err)
+               }
+       }
 
        b := []byte("CONNECTED-MODE SOCKET")
+       _, err = c.(*UDPConn).WriteToUDPAddrPort(b, rap)
+       assertErrWriteToConnected(t, err)
        _, err = c.(*UDPConn).WriteToUDP(b, ra)
-       if err == nil {
-               t.Fatal("should fail")
-       }
-       if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-               t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-       }
+       assertErrWriteToConnected(t, err)
        _, err = c.(*UDPConn).WriteTo(b, ra)
-       if err == nil {
-               t.Fatal("should fail")
-       }
-       if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-               t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-       }
+       assertErrWriteToConnected(t, err)
        _, err = c.Write(b)
        if err != nil {
-               t.Fatal(err)
+               t.Errorf("c.Write(b) = %v; want nil", err)
        }
        _, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, ra)
-       if err == nil {
-               t.Fatal("should fail")
-       }
-       if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-               t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-       }
+       assertErrWriteToConnected(t, err)
        _, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, nil)
        if err != nil {
-               t.Fatal(err)
+               t.Errorf("c.WriteMsgUDP(b, nil, nil) = %v; want nil", err)
+       }
+       _, _, err = c.(*UDPConn).WriteMsgUDPAddrPort(b, nil, rap)
+       assertErrWriteToConnected(t, err)
+       _, _, err = c.(*UDPConn).WriteMsgUDPAddrPort(b, nil, netip.AddrPort{})
+       if err != nil {
+               t.Errorf("c.WriteMsgUDPAddrPort(b, nil, netip.AddrPort{}) = %v; want nil", err)
        }
 }