* Tue Feb 24 2026 Phil Sutter <psutter@redhat.com> [1.1.5-4.el10]
- spec: Require libnftnl-1.3.0-3 for nftnl_{expr,set_elem}_set_imm() (Phil Sutter) [RHEL-128553]
- tests: py: Adjust payloads to changed userdata printing (Phil Sutter) [RHEL-128553]
- tests: py: Update payload records (Phil Sutter) [RHEL-128553]
- tests: py: objects.t: must use input, not output (Phil Sutter) [RHEL-128553]
- tests: py: tools: Add regen_payloads.sh (Phil Sutter) [RHEL-128553]
- netlink: Make use of nftnl_{expr,set_elem}_set_imm() (Phil Sutter) [RHEL-128553]
- netlink: No need to reference array when passing as pointer (Phil Sutter) [RHEL-128553]
- netlink: Introduce struct nft_data_linearize::sizes (Phil Sutter) [RHEL-128553]
- netlink: Introduce struct nft_data_linearize::byteorder (Phil Sutter) [RHEL-128553]
- expression: Set range expression 'len' field (Phil Sutter) [RHEL-128553]
- intervals: Convert byte order implicitly (Phil Sutter) [RHEL-128553]
- mergesort: Align concatenation sort order with Big Endian (Phil Sutter) [RHEL-128553]
- mergesort: Fix sorting of string values (Phil Sutter) [RHEL-128553]
- segtree: Fix range aggregation on Big Endian (Phil Sutter) [RHEL-128553]
Resolves: RHEL-128553
109 lines
3.9 KiB
Diff
109 lines
3.9 KiB
Diff
From 3dbc8914f61700ab156fc9851e45a21c184391f3 Mon Sep 17 00:00:00 2001
|
|
From: Phil Sutter <psutter@redhat.com>
|
|
Date: Tue, 24 Feb 2026 15:53:23 +0100
|
|
Subject: [PATCH] netlink: Introduce struct nft_data_linearize::sizes
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-128553
|
|
Upstream Status: nftables commit 3d5937f52b7d7675a8f9b446a336317b0f36560a
|
|
|
|
commit 3d5937f52b7d7675a8f9b446a336317b0f36560a
|
|
Author: Phil Sutter <phil@nwl.cc>
|
|
Date: Fri Oct 17 17:06:10 2025 +0200
|
|
|
|
netlink: Introduce struct nft_data_linearize::sizes
|
|
|
|
This array holds each concat component's actual length in bytes. It is
|
|
crucial because component data is padded to match register lengths and
|
|
if libnftnl has to print data "in reverse" (to print Little Endian
|
|
values byte-by-byte), it will print extra leading zeroes with odd data
|
|
lengths and thus indicate number of printed bytes does no longer
|
|
correctly reflect actual data length.
|
|
|
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
|
|
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
|
---
|
|
include/netlink.h | 1 +
|
|
src/netlink.c | 14 ++++++++++----
|
|
2 files changed, 11 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/include/netlink.h b/include/netlink.h
|
|
index a762cb4..aa25094 100644
|
|
--- a/include/netlink.h
|
|
+++ b/include/netlink.h
|
|
@@ -107,6 +107,7 @@ struct nft_data_linearize {
|
|
uint32_t chain_id;
|
|
int verdict;
|
|
uint32_t byteorder;
|
|
+ uint8_t sizes[NFT_REG32_COUNT];
|
|
};
|
|
|
|
struct nft_data_delinearize {
|
|
diff --git a/src/netlink.c b/src/netlink.c
|
|
index 939552a..4523d0a 100644
|
|
--- a/src/netlink.c
|
|
+++ b/src/netlink.c
|
|
@@ -381,7 +381,7 @@ static void netlink_gen_concat_key(const struct expr *expr,
|
|
if (byteorder == BYTEORDER_HOST_ENDIAN &&
|
|
expr_basetype(i)->type != TYPE_STRING)
|
|
nld->byteorder |= 1 << n;
|
|
- n++;
|
|
+ nld->sizes[n++] = div_round_up(i->len, BITS_PER_BYTE);
|
|
}
|
|
|
|
nft_data_memcpy(nld, data, len);
|
|
@@ -451,7 +451,7 @@ static void __netlink_gen_concat_expand(const struct expr *expr,
|
|
if (i->byteorder == BYTEORDER_HOST_ENDIAN &&
|
|
expr_basetype(i)->type != TYPE_STRING)
|
|
nld->byteorder |= 1 << n;
|
|
- n++;
|
|
+ nld->sizes[n++] = div_round_up(i->len, BITS_PER_BYTE);
|
|
}
|
|
|
|
list_for_each_entry(i, &expr_concat(expr)->expressions, list) {
|
|
@@ -459,7 +459,7 @@ static void __netlink_gen_concat_expand(const struct expr *expr,
|
|
if (i->byteorder == BYTEORDER_HOST_ENDIAN &&
|
|
expr_basetype(i)->type != TYPE_STRING)
|
|
nld->byteorder |= 1 << n;
|
|
- n++;
|
|
+ nld->sizes[n++] = div_round_up(i->len, BITS_PER_BYTE);
|
|
}
|
|
|
|
nft_data_memcpy(nld, data, len);
|
|
@@ -484,7 +484,7 @@ static void __netlink_gen_concat(const struct expr *expr,
|
|
if (i->byteorder == BYTEORDER_HOST_ENDIAN &&
|
|
expr_basetype(i)->type != TYPE_STRING)
|
|
nld->byteorder |= 1 << n;
|
|
- n++;
|
|
+ nld->sizes[n++] = div_round_up(i->len, BITS_PER_BYTE);
|
|
}
|
|
|
|
nft_data_memcpy(nld, data, len);
|
|
@@ -562,6 +562,8 @@ static void netlink_gen_range(const struct expr *expr,
|
|
offset = netlink_export_pad(data, expr->left->value, expr->left);
|
|
netlink_export_pad(data + offset, expr->right->value, expr->right);
|
|
nft_data_memcpy(nld, data, len);
|
|
+ nld->sizes[0] = div_round_up(expr->left->len, BITS_PER_BYTE);
|
|
+ nld->sizes[1] = div_round_up(expr->right->len, BITS_PER_BYTE);
|
|
}
|
|
|
|
static void netlink_gen_range_value(const struct expr *expr,
|
|
@@ -578,6 +580,8 @@ static void netlink_gen_range_value(const struct expr *expr,
|
|
offset = netlink_export_pad(data, expr->range.low, expr);
|
|
netlink_export_pad(data + offset, expr->range.high, expr);
|
|
nft_data_memcpy(nld, data, len);
|
|
+ nld->sizes[0] = div_round_up(expr->len, BITS_PER_BYTE);
|
|
+ nld->sizes[1] = nld->sizes[0];
|
|
}
|
|
|
|
static void netlink_gen_prefix(const struct expr *expr,
|
|
@@ -598,6 +602,8 @@ static void netlink_gen_prefix(const struct expr *expr,
|
|
mpz_clear(v);
|
|
|
|
nft_data_memcpy(nld, data, len);
|
|
+ nld->sizes[0] = div_round_up(expr->prefix->len, BITS_PER_BYTE);
|
|
+ nld->sizes[1] = nld->sizes[0];
|
|
}
|
|
|
|
static void netlink_gen_key(const struct expr *expr,
|