diff options
| author | database64128 <free122448@hotmail.com> | 2025-08-02 00:42:27 +0800 |
|---|---|---|
| committer | Sean Liao <sean@liao.dev> | 2025-08-27 01:05:25 -0700 |
| commit | 49a2f3ed871c044eb093b16c09202b7dcd875878 (patch) | |
| tree | 128a07c0a3527eace99bec1adf0e8cb6347ab643 /src | |
| parent | afc51ed007ad814fc11273f39055aeea71172557 (diff) | |
| download | go-49a2f3ed871c044eb093b16c09202b7dcd875878.tar.xz | |
net: allow zero value destination address in WriteMsgUDPAddrPort
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/net/ipsock_posix.go | 3 | ||||
| -rw-r--r-- | src/net/net_fake.go | 12 | ||||
| -rw-r--r-- | src/net/udpsock_posix.go | 24 | ||||
| -rw-r--r-- | src/net/udpsock_test.go | 41 |
4 files changed, 47 insertions, 33 deletions
diff --git a/src/net/ipsock_posix.go b/src/net/ipsock_posix.go index 52712f932f..1ed37d7e6e 100644 --- a/src/net/ipsock_posix.go +++ b/src/net/ipsock_posix.go @@ -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()), diff --git a/src/net/net_fake.go b/src/net/net_fake.go index f7eb28e01a..cc35d90a26 100644 --- a/src/net/net_fake.go +++ b/src/net/net_fake.go @@ -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) } diff --git a/src/net/udpsock_posix.go b/src/net/udpsock_posix.go index 3cd1d0a762..99e4359e71 100644 --- a/src/net/udpsock_posix.go +++ b/src/net/udpsock_posix.go @@ -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()} } diff --git a/src/net/udpsock_test.go b/src/net/udpsock_test.go index 3c8da43bdd..7b4bf328e2 100644 --- a/src/net/udpsock_test.go +++ b/src/net/udpsock_test.go @@ -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) } } |
