@@ -15,6 +15,9 @@ const (
1515)
1616
1717func 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
3639func 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
5157func 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
6470func 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
7783func AddrPortToSockaddrInet4 (addrPort netip.AddrPort ) windows.RawSockaddrInet4 {
@@ -103,6 +109,9 @@ func AddrPortToSockaddrInet6(addrPort netip.AddrPort) windows.RawSockaddrInet6 {
103109
104110func 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