summaryrefslogtreecommitdiffstats
path: root/src/mnl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mnl.c')
-rw-r--r--src/mnl.c10
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_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)