aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordatabase64128 <free122448@hotmail.com>2025-08-02 00:42:27 +0800
committerSean Liao <sean@liao.dev>2025-08-27 01:05:25 -0700
commit49a2f3ed871c044eb093b16c09202b7dcd875878 (patch)
tree128a07c0a3527eace99bec1adf0e8cb6347ab643 /src
parentafc51ed007ad814fc11273f39055aeea71172557 (diff)
downloadgo-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.go3
-rw-r--r--src/net/net_fake.go12
-rw-r--r--src/net/udpsock_posix.go24
-rw-r--r--src/net/udpsock_test.go41
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)
}
}