summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2016-06-29 14:11:03 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2016-06-29 14:24:32 +0200
commit775a5a81958e66a69663803dd2e731e3800da9e7 (patch)
tree982134fcfdc6518a62d71901220955e517907fe0 /proto
parent8f01879c5629bd714dfeec968337cfcd4dbe6a87 (diff)
BGP: Skip empty path segments in received AS_PATH
Although RFC 4271 does not forbid empty path segments, they are useless and some implementations consider them invalid. It is clarified in RFC 7606, specifying that AS_PATH with empty segment is considered malformed.
Diffstat (limited to 'proto')
-rw-r--r--proto/bgp/attrs.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index d85afa8f..b8371f32 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -118,7 +118,7 @@ validate_path(struct bgp_proto *p, int as_path, int bs, byte *idata, uint *ileng
{
int res = 0;
u8 *a, *dst;
- int len, plen, copy;
+ int len, plen;
dst = a = idata;
len = *ilength;
@@ -132,15 +132,20 @@ validate_path(struct bgp_proto *p, int as_path, int bs, byte *idata, uint *ileng
if (len < plen)
return -1;
+ if (a[1] == 0)
+ {
+ log(L_WARN "%s: %s_PATH attribute contains empty segment, skipping it",
+ p->p.name, as_path ? "AS" : "AS4");
+ goto skip;
+ }
+
switch (a[0])
{
case AS_PATH_SET:
- copy = 1;
res++;
break;
case AS_PATH_SEQUENCE:
- copy = 1;
res += a[1];
break;
@@ -154,20 +159,17 @@ validate_path(struct bgp_proto *p, int as_path, int bs, byte *idata, uint *ileng
log(L_WARN "%s: %s_PATH attribute contains AS_CONFED_* segment, skipping segment",
p->p.name, as_path ? "AS" : "AS4");
- copy = 0;
- break;
+ goto skip;
default:
return -1;
}
- if (copy)
- {
- if (dst != a)
- memmove(dst, a, plen);
- dst += plen;
- }
+ if (dst != a)
+ memmove(dst, a, plen);
+ dst += plen;
+ skip:
len -= plen;
a += plen;
}