From c10e9556a7bc0e7c942242b606f0acf024ad5d6a Mon Sep 17 00:00:00 2001 From: uhei Date: Fri, 2 Nov 2018 08:55:01 +0000 Subject: [PATCH] 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 Reviewed-by: Mikio Hara --- icmp/extension_test.go | 3 +-- icmp/interface.go | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/icmp/extension_test.go b/icmp/extension_test.go index a7669dae..ff513091 100644 --- a/icmp/extension_test.go +++ b/icmp/extension_test.go @@ -277,8 +277,7 @@ func TestMarshalAndParseExtension(t *testing.T) { 0x20, 0x00, 0x00, 0x00, }, obj: []byte{ - 0x00, 0x0c, 0x03, 0x02, - 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x03, 0x02, 0x00, 0x00, 0x03, 0x8f, }, ext: &InterfaceIdent{ diff --git a/icmp/interface.go b/icmp/interface.go index 617f757b..ae14818d 100644 --- a/icmp/interface.go +++ b/icmp/interface.go @@ -259,7 +259,7 @@ func (ifi *InterfaceIdent) Len(_ int) int { } return 4 + (l+3)&^3 case typeInterfaceByIndex: - return 4 + 8 + return 4 + 4 case typeInterfaceByAddress: return 4 + 4 + (len(ifi.Addr)+3)&^3 default: @@ -284,7 +284,7 @@ func (ifi *InterfaceIdent) marshal(proto int, b []byte) error { case typeInterfaceByName: copy(b[4:], ifi.Name) case typeInterfaceByIndex: - binary.BigEndian.PutUint64(b[4:4+8], uint64(ifi.Index)) + binary.BigEndian.PutUint32(b[4:4+4], uint32(ifi.Index)) case typeInterfaceByAddress: binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI)) b[4+2] = byte(len(ifi.Addr)) @@ -302,10 +302,10 @@ func parseInterfaceIdent(b []byte) (Extension, error) { case typeInterfaceByName: ifi.Name = strings.Trim(string(b[4:]), string(0)) case typeInterfaceByIndex: - if len(b[4:]) < 8 { + if len(b[4:]) < 4 { 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: if len(b[4:]) < 4 { return nil, errInvalidExtension