path: root/src/mnl.c
diff options
authorPablo Neira Ayuso <>2014-01-30 16:44:58 +0100
committerPablo Neira Ayuso <>2014-01-30 16:48:57 +0100
commit35f689ec8726dc262834d1906609bab85cebf976 (patch)
tree39146963d3b8112671c3f1eb47c50770031409da /src/mnl.c
parent11ba3257796afbca42d9d6db7febf33f8cf90b92 (diff)
mnl: fix inclusion of last rule in batch page
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: Signed-off-by: Pablo Neira Ayuso <>
Diffstat (limited to 'src/mnl.c')
1 files changed, 10 insertions, 0 deletions
diff --git a/src/mnl.c b/src/mnl.c
index b8679022..a38a9ae2 100644
--- 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 = 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)