Skip to content

Commit e9cd716

Browse files
raggigopherbot
authored andcommitted
route: fix parse of zero-length sockaddrs in RIBs
Zero-length sockaddrs were observed in RIBs within golang/go#70528. These records are to be skipped, and an invariant for later slice manipulation is to be enforced by a defensive check in parseAddr. Fixes golang/go#70528 Change-Id: I4b8b5bd2339bbadc1d1be1ce14deeb6dd3b8e536 GitHub-Last-Rev: 066ba8a GitHub-Pull-Request: #228 Reviewed-on: https://go-review.googlesource.com/c/net/+/631475 Auto-Submit: Ian Lance Taylor <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Reviewed-by: Damien Neil <[email protected]>
1 parent 9a51899 commit e9cd716

File tree

2 files changed

+66
-10
lines changed

2 files changed

+66
-10
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]) || 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]) || 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 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

route/address_darwin_test.go

+55-3
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,61 @@ var parseAddrsOnDarwinLittleEndianTests = []parseAddrsOnDarwinTest{
8686
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
8787
},
8888
[]Addr{
89-
&Inet6Addr{IP: [16]byte{ 0xfd, 0x84, 0x1b, 0x4e, 0x62, 0x81 }},
90-
&Inet6Addr{IP: [16]byte{ 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x2f, 0x4b, 0xff, 0xfe, 0x09, 0x3b, 0xff }, ZoneID: 33},
91-
&Inet6Addr{IP: [16]byte{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,}},
89+
&Inet6Addr{IP: [16]byte{0xfd, 0x84, 0x1b, 0x4e, 0x62, 0x81}},
90+
&Inet6Addr{IP: [16]byte{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x2f, 0x4b, 0xff, 0xfe, 0x09, 0x3b, 0xff}, ZoneID: 33},
91+
&Inet6Addr{IP: [16]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
92+
nil,
93+
nil,
94+
nil,
95+
nil,
96+
nil,
97+
},
98+
},
99+
// golang/go#70528, the kernel can produce addresses of length 0
100+
{
101+
syscall.RTA_DST | syscall.RTA_GATEWAY | syscall.RTA_NETMASK,
102+
parseKernelInetAddr,
103+
[]byte{
104+
0x00, 0x1e, 0x00, 0x00,
105+
106+
0x1c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107+
0xfe, 0x80, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00,
108+
0xf2, 0x2f, 0x4b, 0xff, 0xfe, 0x09, 0x3b, 0xff,
109+
0x00, 0x00, 0x00, 0x00,
110+
111+
0x0e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112+
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
113+
},
114+
[]Addr{
115+
nil,
116+
&Inet6Addr{IP: [16]byte{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x2f, 0x4b, 0xff, 0xfe, 0x09, 0x3b, 0xff}, ZoneID: 33},
117+
&Inet6Addr{IP: [16]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
118+
nil,
119+
nil,
120+
nil,
121+
nil,
122+
nil,
123+
},
124+
},
125+
// Additional case: golang/go/issues/70528#issuecomment-2498692877
126+
{
127+
syscall.RTA_DST | syscall.RTA_GATEWAY | syscall.RTA_NETMASK,
128+
parseKernelInetAddr,
129+
[]byte{
130+
0x84, 0x00, 0x05, 0x04, 0x01, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x01, 0x15, 0x00, 0x00, 0x00,
131+
0x1B, 0x01, 0x00, 0x00, 0xF5, 0x5A, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
136+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
137+
0x14, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138+
0x00, 0x00, 0x00, 0x00,
139+
},
140+
[]Addr{
141+
&Inet4Addr{IP: [4]byte{0x0, 0x0, 0x0, 0x0}},
142+
nil,
143+
nil,
92144
nil,
93145
nil,
94146
nil,

0 commit comments

Comments
 (0)