A problem was reported with parsing of prefixes all/any/default.
Commit 7696f1097f79be2ce5984a8a16103fd17391cac2 fixes the problem,
but there were also other pathces applied:
00b31a6b2ecf73ee477f701098164600a2bfe227, which were intended to
fix the same problem. And they became redundant now. This patch
reverts changes introduced by those redundant patches.

Signed-off-by: Alexander Zubkov <gr...@msu.ru>
---
 ip/iproute.c | 65 ++++++++++++++++++++++++++++++++++++++++++------------------
 lib/utils.c  | 13 ------------
 2 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/ip/iproute.c b/ip/iproute.c
index 32c93ed..bf886fd 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -191,20 +191,42 @@ static int filter_nlmsg(struct nlmsghdr *n, struct rtattr 
**tb, int host_len)
                return 0;
        if ((filter.tos^r->rtm_tos)&filter.tosmask)
                return 0;
-       if (filter.rdst.family &&
-           (r->rtm_family != filter.rdst.family || filter.rdst.bitlen > 
r->rtm_dst_len))
-               return 0;
-       if (filter.mdst.family &&
-           (r->rtm_family != filter.mdst.family ||
-            (filter.mdst.bitlen >= 0 && filter.mdst.bitlen < r->rtm_dst_len)))
-               return 0;
-       if (filter.rsrc.family &&
-           (r->rtm_family != filter.rsrc.family || filter.rsrc.bitlen > 
r->rtm_src_len))
-               return 0;
-       if (filter.msrc.family &&
-           (r->rtm_family != filter.msrc.family ||
-            (filter.msrc.bitlen >= 0 && filter.msrc.bitlen < r->rtm_src_len)))
-               return 0;
+       if (filter.rdst.family) {
+               if (r->rtm_family != filter.rdst.family ||
+                   filter.rdst.bitlen > r->rtm_dst_len)
+                       return 0;
+       } else if (filter.rdst.flags & PREFIXLEN_SPECIFIED) {
+               if (filter.rdst.bitlen > r->rtm_dst_len)
+                       return 0;
+       }
+       if (filter.mdst.family) {
+               if (r->rtm_family != filter.mdst.family ||
+                   (filter.mdst.bitlen >= 0 &&
+                    filter.mdst.bitlen < r->rtm_dst_len))
+                       return 0;
+       } else if (filter.mdst.flags & PREFIXLEN_SPECIFIED) {
+               if (filter.mdst.bitlen >= 0 &&
+                   filter.mdst.bitlen < r->rtm_dst_len)
+                       return 0;
+       }
+       if (filter.rsrc.family) {
+               if (r->rtm_family != filter.rsrc.family ||
+                   filter.rsrc.bitlen > r->rtm_src_len)
+                       return 0;
+       } else if (filter.rsrc.flags & PREFIXLEN_SPECIFIED) {
+               if (filter.rsrc.bitlen > r->rtm_src_len)
+                       return 0;
+       }
+       if (filter.msrc.family) {
+               if (r->rtm_family != filter.msrc.family ||
+                   (filter.msrc.bitlen >= 0 &&
+                    filter.msrc.bitlen < r->rtm_src_len))
+                       return 0;
+       } else if (filter.msrc.flags & PREFIXLEN_SPECIFIED) {
+               if (filter.msrc.bitlen >= 0 &&
+                   filter.msrc.bitlen < r->rtm_src_len)
+                       return 0;
+       }
        if (filter.rvia.family) {
                int family = r->rtm_family;
 
@@ -221,7 +243,9 @@ static int filter_nlmsg(struct nlmsghdr *n, struct rtattr 
**tb, int host_len)
 
        if (tb[RTA_DST])
                memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8);
-       if (filter.rsrc.family || filter.msrc.family) {
+       if (filter.rsrc.family || filter.msrc.family ||
+           filter.rsrc.flags & PREFIXLEN_SPECIFIED ||
+           filter.msrc.flags & PREFIXLEN_SPECIFIED) {
                if (tb[RTA_SRC])
                        memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), 
(r->rtm_src_len+7)/8);
        }
@@ -241,15 +265,18 @@ static int filter_nlmsg(struct nlmsghdr *n, struct rtattr 
**tb, int host_len)
                        memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), 
host_len/8);
        }
 
-       if (filter.rdst.family && inet_addr_match(&dst, &filter.rdst, 
filter.rdst.bitlen))
+       if ((filter.rdst.family || filter.rdst.flags & PREFIXLEN_SPECIFIED) &&
+           inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen))
                return 0;
-       if (filter.mdst.family && filter.mdst.bitlen >= 0 &&
+       if ((filter.mdst.family || filter.mdst.flags & PREFIXLEN_SPECIFIED) &&
            inet_addr_match(&dst, &filter.mdst, r->rtm_dst_len))
                return 0;
 
-       if (filter.rsrc.family && inet_addr_match(&src, &filter.rsrc, 
filter.rsrc.bitlen))
+       if ((filter.rsrc.family || filter.rsrc.flags & PREFIXLEN_SPECIFIED) &&
+           inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen))
                return 0;
-       if (filter.msrc.family && filter.msrc.bitlen >= 0 &&
+       if ((filter.msrc.family || filter.msrc.flags & PREFIXLEN_SPECIFIED) &&
+           filter.msrc.bitlen >= 0 &&
            inet_addr_match(&src, &filter.msrc, r->rtm_src_len))
                return 0;
 
diff --git a/lib/utils.c b/lib/utils.c
index dadefb5..b9e9a6c 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -693,19 +693,6 @@ int get_prefix_1(inet_prefix *dst, char *arg, int family)
        char *slash;
        int err, bitlen, flags;
 
-       memset(dst, 0, sizeof(*dst));
-
-       if (strcmp(arg, "default") == 0 ||
-           strcmp(arg, "any") == 0 ||
-           strcmp(arg, "all") == 0) {
-               if ((family == AF_DECnet) || (family == AF_MPLS))
-                       return -1;
-               dst->family = family;
-               dst->bytelen = 0;
-               dst->bitlen = 0;
-               return 0;
-       }
-
        slash = strchr(arg, '/');
        if (slash)
                *slash = 0;
-- 
1.9.1

Reply via email to