Skip to content
Snippets Groups Projects
Commit 42839c12 authored by Daniel Czerwonk's avatar Daniel Czerwonk
Browse files

fixed out of bounds

parent d4b9ea31
No related branches found
No related tags found
No related merge requests found
...@@ -58,12 +58,23 @@ func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error) ...@@ -58,12 +58,23 @@ func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error)
variable = variable[1+nextHopLength:] variable = variable[1+nextHopLength:]
idx := uint8(0)
n.Prefixes = make([]bnet.Prefix, 0) n.Prefixes = make([]bnet.Prefix, 0)
if len(variable) == 0 {
return n, nil
}
idx := uint8(0)
for idx < uint8(len(variable)) { for idx < uint8(len(variable)) {
l := numberOfBytesForPrefixLength(variable[idx]) l := numberOfBytesForPrefixLength(variable[idx])
start := idx + 1
end := idx + 1 + l
r := uint8(len(variable)) - idx - 1
if r < l {
return MultiProtocolReachNLRI{}, fmt.Errorf("expected %d bytes for NLRI, only %d remaining", l, r)
}
pfx, err := deserializePrefix(variable[idx+1:idx+1+l], variable[idx], n.AFI) pfx, err := deserializePrefix(variable[start:end], variable[idx], n.AFI)
if err != nil { if err != nil {
return MultiProtocolReachNLRI{}, err return MultiProtocolReachNLRI{}, err
} }
......
...@@ -2,6 +2,7 @@ package packet ...@@ -2,6 +2,7 @@ package packet
import ( import (
"bytes" "bytes"
"fmt"
bnet "github.com/bio-routing/bio-rd/net" bnet "github.com/bio-routing/bio-rd/net"
"github.com/taktv6/tflow2/convert" "github.com/taktv6/tflow2/convert"
...@@ -41,12 +42,21 @@ func deserializeMultiProtocolUnreachNLRI(b []byte) (MultiProtocolUnreachNLRI, er ...@@ -41,12 +42,21 @@ func deserializeMultiProtocolUnreachNLRI(b []byte) (MultiProtocolUnreachNLRI, er
return MultiProtocolUnreachNLRI{}, err return MultiProtocolUnreachNLRI{}, err
} }
if len(prefix) == 0 {
return n, nil
}
idx := uint8(0) idx := uint8(0)
n.Prefixes = make([]bnet.Prefix, 0)
for idx < uint8(len(prefix)) { for idx < uint8(len(prefix)) {
l := numberOfBytesForPrefixLength(prefix[idx]) l := numberOfBytesForPrefixLength(prefix[idx])
start := idx + 1
end := idx + 1 + l
r := uint8(len(prefix)) - idx - 1
if r < l {
return MultiProtocolUnreachNLRI{}, fmt.Errorf("expected %d bytes for NLRI, only %d remaining", l, r)
}
pfx, err := deserializePrefix(prefix[idx+1:idx+1+l], prefix[idx], n.AFI) pfx, err := deserializePrefix(prefix[start:end], prefix[idx], n.AFI)
if err != nil { if err != nil {
return MultiProtocolUnreachNLRI{}, err return MultiProtocolUnreachNLRI{}, err
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment