]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: fixed omitted overflow check in EC constructor
authorMaria Matejka <mq@ucw.cz>
Wed, 14 Aug 2019 09:06:49 +0000 (11:06 +0200)
committerMaria Matejka <mq@ucw.cz>
Tue, 28 Apr 2020 14:21:06 +0000 (16:21 +0200)
filter/f-inst.c

index 4b3c627b57b802e2e6b8ce4e514530b1b2c2be41..3d1859181135e5290d6b3348e55a679e1275f36a 100644 (file)
 
     FID_MEMBER(enum ec_subtype, ecs, f1->ecs != f2->ecs, "ec subtype %s", ec_subtype_str(item->ecs));
 
-    int check, ipv4_used;
+    int ipv4_used;
     u32 key, val;
 
     if (v1.type == T_INT) {
 
     val = v2.val.i;
 
-    if (ecs == EC_GENERIC) {
-      check = 0; RESULT(T_EC, ec, ec_generic(key, val));
-    }
-    else if (ipv4_used) {
-      check = 1; RESULT(T_EC, ec, ec_ip4(ecs, key, val));
-    }
-    else if (key < 0x10000) {
-      check = 0; RESULT(T_EC, ec, ec_as2(ecs, key, val));
-    }
-    else {
-      check = 1; RESULT(T_EC, ec, ec_as4(ecs, key, val));
-    }
-
-    if (check && (val > 0xFFFF))
-      runtime("Value %u > %u out of bounds in EC constructor", val, 0xFFFF);
+    if (ecs == EC_GENERIC)
+      RESULT(T_EC, ec, ec_generic(key, val));
+    else if (ipv4_used)
+      if (val <= 0xFFFF)
+       RESULT(T_EC, ec, ec_ip4(ecs, key, val));
+      else
+       runtime("4-byte value %u can't be used with IP-address key in extended community", val);
+    else if (key < 0x10000)
+      RESULT(T_EC, ec, ec_as2(ecs, key, val));
+    else
+      if (val <= 0xFFFF)
+       RESULT(T_EC, ec, ec_as4(ecs, key, val));
+      else
+       runtime("4-byte value %u can't be used with 4-byte ASN in extended community", val);
   }
 
   INST(FI_LC_CONSTRUCT, 3, 1) {