owipcalc: fix contains not respect default route 14539/head
authorNick Hainke <vincent@systemli.org>
Sat, 23 Jan 2021 12:48:11 +0000 (13:48 +0100)
committerNick Hainke <vincent@systemli.org>
Sat, 23 Jan 2021 16:48:18 +0000 (17:48 +0100)
In IPv4 the default route can be written as
 0.0.0.0/0

In IPv6 the default route can be written as
 ::/0

If u try
  owipcalc 0.0.0.0/0 contains 1.1.1.1
or
  owipcalc ::/0 contains ::1
owipcalc will respond with 0 meaning that the "default prefixes" do not
contain the routes.
That is why we check now for 0 prefix.

Furthermore, if the prefix is 0, i will be 16. We will access a negative
array entry in the line:
 uint8_t net1 = x->s6_addr[15-i] & m;

Divide by % 16 to prevent i becoming 16:
 uint8_t i = ((128 - a->prefix) / 8) % 16;

Signed-off-by: Nick Hainke <vincent@systemli.org>
net/owipcalc/Makefile
net/owipcalc/src/owipcalc.c

index dc68a0346ba9cd0608a6835e425e88a1d050fef6..c7857f5c87172e65cf1207b9637d3efea5b08d1c 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=owipcalc
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 PKG_LICENSE:=Apache-2.0
 
 include $(INCLUDE_DIR)/package.mk
index 5ed609f1580e264cb657d20c32b72fc460641166..fa656948b0756fe0914e1580460ae2bf46e89f18 100644 (file)
@@ -227,7 +227,7 @@ static bool cidr_contains4(struct cidr *a, struct cidr *b)
        if (printed)
                qprintf(" ");
 
-       if ((b->prefix >= a->prefix) && (net1 == net2))
+       if ((a->prefix == 0) || ((b->prefix >= a->prefix) && (net1 == net2)))
        {
                qprintf("1");
                return true;
@@ -529,7 +529,7 @@ static bool cidr_contains6(struct cidr *a, struct cidr *b)
 {
        struct in6_addr *x = &a->addr.v6;
        struct in6_addr *y = &b->addr.v6;
-       uint8_t i = (128 - a->prefix) / 8;
+       uint8_t i = ((128 - a->prefix) / 8) % 16;
        uint8_t m = ~((1 << ((128 - a->prefix) % 8)) - 1);
        uint8_t net1 = x->s6_addr[15-i] & m;
        uint8_t net2 = y->s6_addr[15-i] & m;
@@ -537,8 +537,9 @@ static bool cidr_contains6(struct cidr *a, struct cidr *b)
        if (printed)
                qprintf(" ");
 
-       if ((b->prefix >= a->prefix) && (net1 == net2) &&
-           ((i == 15) || !memcmp(&x->s6_addr, &y->s6_addr, 15-i)))
+       if ((a->prefix == 0) ||
+           ((b->prefix >= a->prefix) && (net1 == net2) &&
+           ((i == 15) || !memcmp(&x->s6_addr, &y->s6_addr, 15-i))))
        {
                qprintf("1");
                return true;