Skip to content

Commit 4c7e109

Browse files
committed
route: avoid panic on records that don't contain sockaddrs
Fixes #70528
1 parent 9a51899 commit 4c7e109

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

route/address.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func parseInetAddr(af int, b []byte) (Addr, error) {
176176
)
177177
switch af {
178178
case syscall.AF_INET:
179-
if len(b) < (off4+1) || len(b) < int(b[0]) {
179+
if len(b) < (off4+1) || len(b) < int(b[0]) || int(b[0]) == 0 {
180180
return nil, errInvalidAddr
181181
}
182182
sockAddrLen := int(b[0])
@@ -188,7 +188,7 @@ func parseInetAddr(af int, b []byte) (Addr, error) {
188188
copy(a.IP[:], b[off4:n])
189189
return a, nil
190190
case syscall.AF_INET6:
191-
if len(b) < (off6+1) || len(b) < int(b[0]) {
191+
if len(b) < (off6+1) || len(b) < int(b[0]) || int(b[0]) == 0 {
192192
return nil, errInvalidAddr
193193
}
194194
sockAddrLen := int(b[0])
@@ -404,12 +404,16 @@ func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) (
404404
}
405405
b = b[l:]
406406
case syscall.AF_INET, syscall.AF_INET6:
407-
af = int(b[1])
408-
a, err := parseInetAddr(af, b)
409-
if err != nil {
410-
return nil, err
407+
// #70528: if the sockaddrlen is 0, no address to parse inside,
408+
// skip over the record.
409+
if int(b[0]) > 0 {
410+
af = int(b[1])
411+
a, err := parseInetAddr(af, b)
412+
if err != nil {
413+
return nil, err
414+
}
415+
as[i] = a
411416
}
412-
as[i] = a
413417
l := roundup(int(b[0]))
414418
if len(b) < l {
415419
return nil, errMessageTooShort

0 commit comments

Comments
 (0)