]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Skip empty path segments in received AS_PATH
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 29 Jun 2016 12:11:03 +0000 (14:11 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 29 Jun 2016 12:24:32 +0000 (14:24 +0200)
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.

proto/bgp/attrs.c

index d85afa8f194c7bb894779919b609072b7aee9adb..b8371f322508096967440802f01b37211b97ac82 100644 (file)
@@ -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;
     }