Skip to content

Commit 08a001e

Browse files
ivgfujita
authored andcommitted
pkg/packet/bgp: fix SoftVersion capability parser to check the input length
func (c *CapSoftwareVersion) DecodeFromBytes(data []byte) error { c.DefaultParameterCapability.DecodeFromBytes(data) data = data[2:] if len(data) < 2 { return NewMessageError(BGP_ERROR_OPEN_MESSAGE_ERROR, BGP_ERROR_SUB_UNSUPPORTED_CAPABILITY, nil, "Not all CapabilitySoftwareVersion bytes allowed") } softwareVersionLen := uint8(data[0]) if len(data[1:]) < int(softwareVersionLen) || softwareVersionLen > 64 { return NewMessageError(BGP_ERROR_OPEN_MESSAGE_ERROR, BGP_ERROR_SUB_UNSUPPORTED_CAPABILITY, nil, "invalid length of software version capablity") } c.SoftwareVersionLen = softwareVersionLen c.SoftwareVersion = string(data[1:c.SoftwareVersionLen]) // ivg: note the crash is here return nil } Notice that `softwareVersionLen` is not checked for `0`, so `data[1:c.SoftwareVersionLen]` becomes `data[1:0]`, which leads to a runtime panic.
1 parent ca7383f commit 08a001e

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

pkg/packet/bgp/bgp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1094,7 +1094,7 @@ func (c *CapSoftwareVersion) DecodeFromBytes(data []byte) error {
10941094
return NewMessageError(BGP_ERROR_OPEN_MESSAGE_ERROR, BGP_ERROR_SUB_UNSUPPORTED_CAPABILITY, nil, "Not all CapabilitySoftwareVersion bytes allowed")
10951095
}
10961096
softwareVersionLen := uint8(data[0])
1097-
if len(data[1:]) < int(softwareVersionLen) || softwareVersionLen > 64 {
1097+
if len(data[1:]) < int(softwareVersionLen) || softwareVersionLen > 64 || softwareVersionLen == 0 {
10981098
return NewMessageError(BGP_ERROR_OPEN_MESSAGE_ERROR, BGP_ERROR_SUB_UNSUPPORTED_CAPABILITY, nil, "invalid length of software version capablity")
10991099
}
11001100
c.SoftwareVersionLen = softwareVersionLen

0 commit comments

Comments
 (0)