Skip to content

Commit beccd40

Browse files
committed
0️⃣ conn: permit nil sockaddr and zero value address
1 parent 078d749 commit beccd40

File tree

4 files changed

+49
-28
lines changed

4 files changed

+49
-28
lines changed

conn/sockaddr_linuxsolaris.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import (
1111
)
1212

1313
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) {
14+
if !addrPort.IsValid() {
15+
return
16+
}
1417
addr, port := addrPort.Addr(), addrPort.Port()
1518
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
1619
p[0] = byte(port >> 8)

conn/sockaddr_notlinuxsolariswindows.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import (
1111
)
1212

1313
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) {
14+
if !addrPort.IsValid() {
15+
return
16+
}
1417
addr, port := addrPort.Addr(), addrPort.Port()
1518
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
1619
p[0] = byte(port >> 8)

conn/sockaddr_notwindows.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import (
1212
)
1313

1414
func SockaddrValueToAddrPort(rsa6 unix.RawSockaddrInet6, namelen uint32) (netip.AddrPort, error) {
15+
if namelen == 0 {
16+
return netip.AddrPort{}, nil
17+
}
1518
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
1619
port := uint16(p[0])<<8 + uint16(p[1])
1720
var addr netip.Addr
@@ -27,33 +30,36 @@ func SockaddrValueToAddrPort(rsa6 unix.RawSockaddrInet6, namelen uint32) (netip.
2730
}
2831

2932
func AddrPortToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
30-
if addrPort.Addr().Is4() {
33+
switch {
34+
case !addrPort.IsValid():
35+
return nil, 0
36+
case addrPort.Addr().Is4():
3137
rsa4 := AddrPortToSockaddrInet4(addrPort)
32-
name = (*byte)(unsafe.Pointer(&rsa4))
33-
namelen = unix.SizeofSockaddrInet4
34-
} else {
38+
return (*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4
39+
default:
3540
rsa6 := AddrPortToSockaddrInet6(addrPort)
36-
name = (*byte)(unsafe.Pointer(&rsa6))
37-
namelen = unix.SizeofSockaddrInet6
41+
return (*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6
3842
}
39-
return
4043
}
4144

4245
func AddrPortUnmappedToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
43-
if addr := addrPort.Addr(); addr.Is4() || addr.Is4In6() {
46+
switch {
47+
case !addrPort.IsValid():
48+
return nil, 0
49+
case addrPort.Addr().Is4() || addrPort.Addr().Is4In6():
4450
rsa4 := AddrPortToSockaddrInet4(addrPort)
45-
name = (*byte)(unsafe.Pointer(&rsa4))
46-
namelen = unix.SizeofSockaddrInet4
47-
} else {
51+
return (*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4
52+
default:
4853
rsa6 := AddrPortToSockaddrInet6(addrPort)
49-
name = (*byte)(unsafe.Pointer(&rsa6))
50-
namelen = unix.SizeofSockaddrInet6
54+
return (*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6
5155
}
52-
return
5356
}
5457

5558
func SockaddrToAddrPort(name *byte, namelen uint32) (netip.AddrPort, error) {
5659
switch namelen {
60+
case 0:
61+
return netip.AddrPort{}, nil
62+
5763
case unix.SizeofSockaddrInet4:
5864
rsa4 := (*unix.RawSockaddrInet4)(unsafe.Pointer(name))
5965
return SockaddrInet4ToAddrPort(rsa4), nil

conn/sockaddr_windows.go

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ const (
1515
)
1616

1717
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 windows.RawSockaddrInet6, namelen uint32) {
18+
if !addrPort.IsValid() {
19+
return
20+
}
1821
addr, port := addrPort.Addr(), addrPort.Port()
1922
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
2023
p[0] = byte(port >> 8)
@@ -34,6 +37,9 @@ func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 windows.RawSockaddrI
3437
}
3538

3639
func SockaddrValueToAddrPort(rsa6 windows.RawSockaddrInet6, namelen uint32) (netip.AddrPort, error) {
40+
if namelen == 0 {
41+
return netip.AddrPort{}, nil
42+
}
3743
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
3844
port := uint16(p[0])<<8 + uint16(p[1])
3945
var addr netip.Addr
@@ -49,29 +55,29 @@ func SockaddrValueToAddrPort(rsa6 windows.RawSockaddrInet6, namelen uint32) (net
4955
}
5056

5157
func AddrPortToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
52-
if addrPort.Addr().Is4() {
58+
switch {
59+
case !addrPort.IsValid():
60+
return nil, 0
61+
case addrPort.Addr().Is4():
5362
rsa4 := AddrPortToSockaddrInet4(addrPort)
54-
name = (*byte)(unsafe.Pointer(&rsa4))
55-
namelen = SizeofSockaddrInet4
56-
} else {
63+
return (*byte)(unsafe.Pointer(&rsa4)), SizeofSockaddrInet4
64+
default:
5765
rsa6 := AddrPortToSockaddrInet6(addrPort)
58-
name = (*byte)(unsafe.Pointer(&rsa6))
59-
namelen = SizeofSockaddrInet6
66+
return (*byte)(unsafe.Pointer(&rsa6)), SizeofSockaddrInet6
6067
}
61-
return
6268
}
6369

6470
func AddrPortUnmappedToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
65-
if addr := addrPort.Addr(); addr.Is4() || addr.Is4In6() {
71+
switch {
72+
case !addrPort.IsValid():
73+
return nil, 0
74+
case addrPort.Addr().Is4() || addrPort.Addr().Is4In6():
6675
rsa4 := AddrPortToSockaddrInet4(addrPort)
67-
name = (*byte)(unsafe.Pointer(&rsa4))
68-
namelen = SizeofSockaddrInet4
69-
} else {
76+
return (*byte)(unsafe.Pointer(&rsa4)), SizeofSockaddrInet4
77+
default:
7078
rsa6 := AddrPortToSockaddrInet6(addrPort)
71-
name = (*byte)(unsafe.Pointer(&rsa6))
72-
namelen = SizeofSockaddrInet6
79+
return (*byte)(unsafe.Pointer(&rsa6)), SizeofSockaddrInet6
7380
}
74-
return
7581
}
7682

7783
func AddrPortToSockaddrInet4(addrPort netip.AddrPort) windows.RawSockaddrInet4 {
@@ -103,6 +109,9 @@ func AddrPortToSockaddrInet6(addrPort netip.AddrPort) windows.RawSockaddrInet6 {
103109

104110
func SockaddrToAddrPort(name *byte, namelen uint32) (netip.AddrPort, error) {
105111
switch namelen {
112+
case 0:
113+
return netip.AddrPort{}, nil
114+
106115
case SizeofSockaddrInet4:
107116
rsa4 := (*windows.RawSockaddrInet4)(unsafe.Pointer(name))
108117
return SockaddrInet4ToAddrPort(rsa4), nil

0 commit comments

Comments
 (0)