]> git.ipfire.org Git - thirdparty/nftables.git/commit
segtree: fix decomposition of unclosed intervals containing address prefixes
authorJeremy Sowden <jeremy@azazel.net>
Sun, 18 Sep 2022 17:22:12 +0000 (18:22 +0100)
committerFlorian Westphal <fw@strlen.de>
Wed, 21 Sep 2022 11:57:09 +0000 (13:57 +0200)
commit7e6be917987c3ab0261bf543eb307cbb2679294f
tree34d83ccfceb653b19ed762ebdee18cd66fef71fd
parentd899df24826c268c764edb07c3a3ed3f2c90b253
segtree: fix decomposition of unclosed intervals containing address prefixes

The code which decomposes unclosed intervals doesn't check for prefixes.  This
leads to incorrect output for sets which contain these.  For example,

  # nft -f - <<END
  table ip t {
    chain c {
      ip saddr 192.0.0.0/2 drop
      ip saddr 10.0.0.0/8 drop
      ip saddr { 192.0.0.0/2, 10.0.0.0/8 } drop
    }
  }
  table ip6 t {
    chain c {
      ip6 saddr ff00::/8 drop
      ip6 saddr fe80::/10 drop
      ip6 saddr { ff00::/8, fe80::/10 } drop
    }
  }
  END
  # nft list table ip6 t
  table ip6 t {
    chain c {
      ip6 saddr ff00::/8 drop
      ip6 saddr fe80::/10 drop
      ip6 saddr { fe80::/10, ff00::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff } drop
    }
  }
  # nft list table ip t
  table ip t {
    chain c {
      ip saddr 192.0.0.0/2 drop
      ip saddr 10.0.0.0/8 drop
      ip saddr { 10.0.0.0/8, 192.0.0.0-255.255.255.255 } drop
    }
  }

Instead of treating the final unclosed interval as a special case, reuse the
code which correctly handles closed intervals.

Add a shell test-case.

Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1018156
Fixes: 86b965bdab8d ("segtree: fix decomposition of unclosed intervals")
Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
src/segtree.c
tests/shell/testcases/sets/0071unclosed_prefix_interval_0 [new file with mode: 0755]
tests/shell/testcases/sets/dumps/0071unclosed_prefix_interval_0.nft [new file with mode: 0644]