@@ -50,14 +50,20 @@ func NewSerializer(options ...SerializerOption) *Serializer {
5050
5151func (s * Serializer ) WriteAddress (buffer * buf.Buffer , addr Socksaddr ) error {
5252 var af Family
53- if addr .IsIPv4 () {
53+ if ! addr .IsValid () {
54+ af = AddressFamilyFqdn
55+ } else if addr .IsIPv4 () {
5456 af = AddressFamilyIPv4
5557 } else if addr .IsIPv6 () {
5658 af = AddressFamilyIPv6
5759 } else {
5860 af = AddressFamilyFqdn
5961 }
60- err := buffer .WriteByte (s .familyByteMap [af ])
62+ afByte , loaded := s .familyByteMap [af ]
63+ if ! loaded {
64+ return E .New ("unsupported address" )
65+ }
66+ err := buffer .WriteByte (afByte )
6167 if err != nil {
6268 return err
6369 }
@@ -70,7 +76,14 @@ func (s *Serializer) WriteAddress(buffer *buf.Buffer, addr Socksaddr) error {
7076}
7177
7278func (s * Serializer ) AddressLen (addr Socksaddr ) int {
73- if addr .IsIPv4 () {
79+ if ! addr .IsValid () {
80+ _ , supportEmpty := s .familyByteMap [AddressFamilyEmpty ]
81+ if supportEmpty {
82+ return 1
83+ } else {
84+ return 2
85+ }
86+ } else if addr .IsIPv4 () {
7487 return 5
7588 } else if addr .IsIPv6 () {
7689 return 17
@@ -129,26 +142,24 @@ func (s *Serializer) ReadAddress(reader io.Reader) (Socksaddr, error) {
129142 return Socksaddr {}, E .Cause (err , "read fqdn" )
130143 }
131144 return ParseSocksaddrHostPort (fqdn , 0 ), nil
132- default :
133- switch family {
134- case AddressFamilyIPv4 :
135- var addr [4 ]byte
136- err = common .Error (reader .Read (addr [:]))
137- if err != nil {
138- return Socksaddr {}, E .Cause (err , "read ipv4 address" )
139- }
140- return Socksaddr {Addr : netip .AddrFrom4 (addr )}, nil
141- case AddressFamilyIPv6 :
142- var addr [16 ]byte
143- err = common .Error (reader .Read (addr [:]))
144- if err != nil {
145- return Socksaddr {}, E .Cause (err , "read ipv6 address" )
146- }
147-
148- return Socksaddr {Addr : netip .AddrFrom16 (addr )}.Unwrap (), nil
149- default :
150- return Socksaddr {}, E .New ("unknown address family: " , af )
145+ case AddressFamilyIPv4 :
146+ var addr [4 ]byte
147+ _ , err = io .ReadFull (reader , addr [:])
148+ if err != nil {
149+ return Socksaddr {}, E .Cause (err , "read ipv4 address" )
150+ }
151+ return Socksaddr {Addr : netip .AddrFrom4 (addr )}, nil
152+ case AddressFamilyIPv6 :
153+ var addr [16 ]byte
154+ _ , err = io .ReadFull (reader , addr [:])
155+ if err != nil {
156+ return Socksaddr {}, E .Cause (err , "read ipv6 address" )
151157 }
158+ return Socksaddr {Addr : netip .AddrFrom16 (addr )}.Unwrap (), nil
159+ case AddressFamilyEmpty :
160+ return Socksaddr {}, nil
161+ default :
162+ return Socksaddr {}, E .New ("unknown address family: " , af )
152163 }
153164}
154165
0 commit comments