]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft: fix bad length when comparing extension data area
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 8 Oct 2013 10:13:57 +0000 (12:13 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 30 Dec 2013 22:50:52 +0000 (23:50 +0100)
Use ->userspacesize to compare the extension data area, otherwise
we also compare the internal private pointers which are only
meaningful to the kernelspace.

This fixes:

xtables -4 -D INPUT -m connlimit \
--connlimit-above 10 --connlimit-mask 32 --connlimit-daddr

But it also fixes many other matches/targets which use internal
private data.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
iptables/nft-shared.c

index ebcb9692e6501aecc12481d6c862ae53af2d3224..3987f74b202c21177c706b1f484160a212e175b5 100644 (file)
@@ -683,7 +683,7 @@ compare_matches(struct xtables_rule_match *mt1, struct xtables_rule_match *mt2)
                }
 
                if (memcmp(m1->data, m2->data,
-                          m1->u.user.match_size - sizeof(*m1)) != 0) {
+                          mp1->match->userspacesize) != 0) {
                        DEBUGP("mismatch match data\n");
                        return false;
                }
@@ -709,10 +709,8 @@ bool compare_targets(struct xtables_target *tg1, struct xtables_target *tg2)
        if (strcmp(tg1->t->u.user.name, tg2->t->u.user.name) != 0)
                return false;
 
-       if (memcmp(tg1->t->data, tg2->t->data,
-                  tg1->t->u.user.target_size - sizeof(*tg1->t)) != 0) {
+       if (memcmp(tg1->t->data, tg2->t->data, tg1->userspacesize) != 0)
                return false;
-       }
 
        return true;
 }