Skip to content

Commit bdcab5d

Browse files
committed
icmp: add missing attribute length check
Fixes golang/go#10951. Change-Id: I94bf948ce74f8289008930701b2825ffcf57fce1 Reviewed-on: https://go-review.googlesource.com/10378 Reviewed-by: Ian Lance Taylor <iant@golang.org>
1 parent 621fff3 commit bdcab5d

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

icmp/extension_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,22 @@ func TestMarshalAndParseExtension(t *testing.T) {
238238
}
239239
}
240240
}
241+
242+
var parseInterfaceNameTests = []struct {
243+
b []byte
244+
error
245+
}{
246+
{[]byte{0, 'e', 'n', '0'}, errInvalidExtension},
247+
{[]byte{4, 'e', 'n', '0'}, nil},
248+
{[]byte{7, 'e', 'n', '0', 0xff, 0xff, 0xff, 0xff}, errInvalidExtension},
249+
{[]byte{8, 'e', 'n', '0', 0xff, 0xff, 0xff}, errMessageTooShort},
250+
}
251+
252+
func TestParseInterfaceName(t *testing.T) {
253+
ifi := InterfaceInfo{Interface: &net.Interface{}}
254+
for i, tt := range parseInterfaceNameTests {
255+
if _, err := ifi.parseName(tt.b); err != tt.error {
256+
t.Errorf("#%d: got %v; want %v", i, err, tt.error)
257+
}
258+
}
259+
}

icmp/interface.go

+3
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ func (ifi *InterfaceInfo) parseName(b []byte) ([]byte, error) {
174174
return nil, errMessageTooShort
175175
}
176176
l := int(b[0])
177+
if l%4 != 0 || 4 > l || l > 64 {
178+
return nil, errInvalidExtension
179+
}
177180
var name [63]byte
178181
copy(name[:], b[1:l])
179182
ifi.Interface.Name = strings.Trim(string(name[:]), "\000")

icmp/message.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ import (
2424
)
2525

2626
var (
27-
errMessageTooShort = errors.New("message too short")
28-
errHeaderTooShort = errors.New("header too short")
29-
errBufferTooShort = errors.New("buffer too short")
30-
errOpNoSupport = errors.New("operation not supported")
31-
errNoExtension = errors.New("no extension")
27+
errMessageTooShort = errors.New("message too short")
28+
errHeaderTooShort = errors.New("header too short")
29+
errBufferTooShort = errors.New("buffer too short")
30+
errOpNoSupport = errors.New("operation not supported")
31+
errNoExtension = errors.New("no extension")
32+
errInvalidExtension = errors.New("invalid extension")
3233
)
3334

3435
func checksum(b []byte) uint16 {

0 commit comments

Comments
 (0)