Commit c10e9556 authored by uhei's avatar uhei Committed by Mikio Hara

icmp: fix InterfaceIdent.Index handling

RFC 7223, Section 3 defines 32 bits for if-index.
RFC 8335, Section 2.1 defines
"If the Interface Identification Object identifies the probed
interface by index, the length is equal to 8 and the payload contains
the if-index [RFC7223]."
The object should be comprised of a 4-byte object header and a 4-byte interface index.

Fixes golang/go#28530

Change-Id: Ib3ac729b7ec738a90a8c76ef984da0d5b28fa9c9
GitHub-Last-Rev: eba6714ed4c7af61e89f6e54d6a7544c570acebb
GitHub-Pull-Request: golang/net#23
Reviewed-on: https://go-review.googlesource.com/c/146637
Run-TryBot: Mikio Hara <mikioh.public.networking@gmail.com>
Reviewed-by: 's avatarMikio Hara <mikioh.public.networking@gmail.com>
parent b7e29687
...@@ -277,8 +277,7 @@ func TestMarshalAndParseExtension(t *testing.T) { ...@@ -277,8 +277,7 @@ func TestMarshalAndParseExtension(t *testing.T) {
0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
}, },
obj: []byte{ obj: []byte{
0x00, 0x0c, 0x03, 0x02, 0x00, 0x08, 0x03, 0x02,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x8f, 0x00, 0x00, 0x03, 0x8f,
}, },
ext: &InterfaceIdent{ ext: &InterfaceIdent{
......
...@@ -259,7 +259,7 @@ func (ifi *InterfaceIdent) Len(_ int) int { ...@@ -259,7 +259,7 @@ func (ifi *InterfaceIdent) Len(_ int) int {
} }
return 4 + (l+3)&^3 return 4 + (l+3)&^3
case typeInterfaceByIndex: case typeInterfaceByIndex:
return 4 + 8 return 4 + 4
case typeInterfaceByAddress: case typeInterfaceByAddress:
return 4 + 4 + (len(ifi.Addr)+3)&^3 return 4 + 4 + (len(ifi.Addr)+3)&^3
default: default:
...@@ -284,7 +284,7 @@ func (ifi *InterfaceIdent) marshal(proto int, b []byte) error { ...@@ -284,7 +284,7 @@ func (ifi *InterfaceIdent) marshal(proto int, b []byte) error {
case typeInterfaceByName: case typeInterfaceByName:
copy(b[4:], ifi.Name) copy(b[4:], ifi.Name)
case typeInterfaceByIndex: case typeInterfaceByIndex:
binary.BigEndian.PutUint64(b[4:4+8], uint64(ifi.Index)) binary.BigEndian.PutUint32(b[4:4+4], uint32(ifi.Index))
case typeInterfaceByAddress: case typeInterfaceByAddress:
binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI)) binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI))
b[4+2] = byte(len(ifi.Addr)) b[4+2] = byte(len(ifi.Addr))
...@@ -302,10 +302,10 @@ func parseInterfaceIdent(b []byte) (Extension, error) { ...@@ -302,10 +302,10 @@ func parseInterfaceIdent(b []byte) (Extension, error) {
case typeInterfaceByName: case typeInterfaceByName:
ifi.Name = strings.Trim(string(b[4:]), string(0)) ifi.Name = strings.Trim(string(b[4:]), string(0))
case typeInterfaceByIndex: case typeInterfaceByIndex:
if len(b[4:]) < 8 { if len(b[4:]) < 4 {
return nil, errInvalidExtension return nil, errInvalidExtension
} }
ifi.Index = int(binary.BigEndian.Uint64(b[4 : 4+8])) ifi.Index = int(binary.BigEndian.Uint32(b[4 : 4+4]))
case typeInterfaceByAddress: case typeInterfaceByAddress:
if len(b[4:]) < 4 { if len(b[4:]) < 4 {
return nil, errInvalidExtension return nil, errInvalidExtension
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment