]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
mnl: fix inclusion of last rule in batch page
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 30 Jan 2014 15:44:58 +0000 (16:44 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 30 Jan 2014 15:48:57 +0000 (16:48 +0100)
This patch fixes the inclusion of the last rule that didn't fit
into a batch page.

When using sets this has manifested with the -EBUSY error when deleting
the table (it was still containing unused sets after the flush).

The following command line works fine here:

nft -f test ; nft flush table filter ; nft delete chain filter output; nft delete table filter

Tested using this kernel patch: http://patchwork.ozlabs.org/patch/314143/

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/mnl.c

index b867902274f0d9d5db31aa3068ab3aeb6da9f942..a38a9ae23f1cc6c7d91cdb4bbb2f1e35bc869c88 100644 (file)
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -19,6 +19,7 @@
 #include <linux/netfilter/nf_tables.h>
 
 #include <mnl.h>
+#include <string.h>
 #include <errno.h>
 #include <utils.h>
 #include <nftables.h>
@@ -98,12 +99,21 @@ struct batch_page {
 static void mnl_batch_page_add(void)
 {
        struct batch_page *batch_page;
+       struct nlmsghdr *last_nlh;
+
+       /* Get the last message not fitting in the batch */
+       last_nlh = mnl_nlmsg_batch_current(batch);
 
        batch_page = xmalloc(sizeof(struct batch_page));
        batch_page->batch = batch;
        list_add_tail(&batch_page->head, &batch_page_list);
        batch_num_pages++;
        batch = mnl_batch_alloc();
+
+       /* Copy the last message not fitting to the new batch page */
+       memcpy(mnl_nlmsg_batch_current(batch), last_nlh, last_nlh->nlmsg_len);
+       /* No overflow may happen as this is a new empty batch page */
+       mnl_nlmsg_batch_next(batch);
 }
 
 static uint32_t mnl_batch_put(int type)