From 3ad775bd24ef85034ec38f73d3eb359e15ad2c25 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Tue, 24 Feb 2026 15:05:32 +0100 Subject: [PATCH] data_reg: Introduce struct nftnl_data_reg::sizes array JIRA: https://issues.redhat.com/browse/RHEL-119650 Upstream Status: libnftnl commit 6077bf5cadd980038c223841c886aa8bc1d5abec commit 6077bf5cadd980038c223841c886aa8bc1d5abec Author: Phil Sutter Date: Thu Oct 16 01:30:20 2025 +0200 data_reg: Introduce struct nftnl_data_reg::sizes array This will hold the actual size of each component in concatenated data. Signed-off-by: Phil Sutter Signed-off-by: Phil Sutter --- include/data_reg.h | 3 ++- src/expr/bitwise.c | 9 ++++++--- src/expr/cmp.c | 3 ++- src/expr/data_reg.c | 6 +++++- src/expr/immediate.c | 3 ++- src/expr/range.c | 4 ++-- src/set_elem.c | 6 +++--- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/data_reg.h b/include/data_reg.h index e22acd1..5cdeba0 100644 --- a/include/data_reg.h +++ b/include/data_reg.h @@ -22,6 +22,7 @@ union nftnl_data_reg { uint32_t val[NFT_DATA_VALUE_MAXLEN / sizeof(uint32_t)]; uint32_t len; uint32_t byteorder; + uint8_t sizes[NFT_REG32_COUNT]; }; struct { uint32_t verdict; @@ -37,6 +38,6 @@ struct nlattr; int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type); int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src, - uint32_t len, uint32_t byteorder); + uint32_t len, uint32_t byteorder, uint8_t *sizes); #endif diff --git a/src/expr/bitwise.c b/src/expr/bitwise.c index a775285..a838e6c 100644 --- a/src/expr/bitwise.c +++ b/src/expr/bitwise.c @@ -51,11 +51,14 @@ nftnl_expr_bitwise_set(struct nftnl_expr *e, uint16_t type, memcpy(&bitwise->len, data, data_len); break; case NFTNL_EXPR_BITWISE_MASK: - return nftnl_data_cpy(&bitwise->mask, data, data_len, byteorder); + return nftnl_data_cpy(&bitwise->mask, data, + data_len, byteorder, NULL); case NFTNL_EXPR_BITWISE_XOR: - return nftnl_data_cpy(&bitwise->xor, data, data_len, byteorder); + return nftnl_data_cpy(&bitwise->xor, data, + data_len, byteorder, NULL); case NFTNL_EXPR_BITWISE_DATA: - return nftnl_data_cpy(&bitwise->data, data, data_len, byteorder); + return nftnl_data_cpy(&bitwise->data, data, + data_len, byteorder, NULL); } return 0; } diff --git a/src/expr/cmp.c b/src/expr/cmp.c index c88e06a..ec5dd62 100644 --- a/src/expr/cmp.c +++ b/src/expr/cmp.c @@ -38,7 +38,8 @@ nftnl_expr_cmp_set(struct nftnl_expr *e, uint16_t type, memcpy(&cmp->op, data, data_len); break; case NFTNL_EXPR_CMP_DATA: - return nftnl_data_cpy(&cmp->data, data, data_len, byteorder); + return nftnl_data_cpy(&cmp->data, data, + data_len, byteorder, NULL); } return 0; } diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c index 45f2d94..d1aadcc 100644 --- a/src/expr/data_reg.c +++ b/src/expr/data_reg.c @@ -202,7 +202,7 @@ int nftnl_parse_data(union nftnl_data_reg *data, struct nlattr *attr, int *type) } int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src, - uint32_t len, uint32_t byteorder) + uint32_t len, uint32_t byteorder, uint8_t *sizes) { int ret = 0; @@ -214,5 +214,9 @@ int nftnl_data_cpy(union nftnl_data_reg *dreg, const void *src, memcpy(dreg->val, src, len); dreg->len = len; dreg->byteorder = byteorder; + if (sizes) + memcpy(dreg->sizes, sizes, sizeof(dreg->sizes)); + else + memset(dreg->sizes, 0, sizeof(dreg->sizes)); return ret; } diff --git a/src/expr/immediate.c b/src/expr/immediate.c index f27b6e6..9453198 100644 --- a/src/expr/immediate.c +++ b/src/expr/immediate.c @@ -32,7 +32,8 @@ nftnl_expr_immediate_set(struct nftnl_expr *e, uint16_t type, memcpy(&imm->dreg, data, data_len); break; case NFTNL_EXPR_IMM_DATA: - return nftnl_data_cpy(&imm->data, data, data_len, byteorder); + return nftnl_data_cpy(&imm->data, data, + data_len, byteorder, NULL); case NFTNL_EXPR_IMM_VERDICT: memcpy(&imm->data.verdict, data, data_len); break; diff --git a/src/expr/range.c b/src/expr/range.c index 4b3101e..12c91e9 100644 --- a/src/expr/range.c +++ b/src/expr/range.c @@ -38,10 +38,10 @@ nftnl_expr_range_set(struct nftnl_expr *e, uint16_t type, break; case NFTNL_EXPR_RANGE_FROM_DATA: return nftnl_data_cpy(&range->data_from, data, - data_len, byteorder); + data_len, byteorder, NULL); case NFTNL_EXPR_RANGE_TO_DATA: return nftnl_data_cpy(&range->data_to, data, - data_len, byteorder); + data_len, byteorder, NULL); } return 0; } diff --git a/src/set_elem.c b/src/set_elem.c index 1c2780b..7ec65b9 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -122,11 +122,11 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr, memcpy(&s->set_elem_flags, data, sizeof(s->set_elem_flags)); break; case NFTNL_SET_ELEM_KEY: /* NFTA_SET_ELEM_KEY */ - if (nftnl_data_cpy(&s->key, data, data_len, 0) < 0) + if (nftnl_data_cpy(&s->key, data, data_len, 0, NULL) < 0) return -1; break; case NFTNL_SET_ELEM_KEY_END: /* NFTA_SET_ELEM_KEY_END */ - if (nftnl_data_cpy(&s->key_end, data, data_len, 0) < 0) + if (nftnl_data_cpy(&s->key_end, data, data_len, 0, NULL) < 0) return -1; break; case NFTNL_SET_ELEM_VERDICT: /* NFTA_SET_ELEM_DATA */ @@ -141,7 +141,7 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr, return -1; break; case NFTNL_SET_ELEM_DATA: /* NFTA_SET_ELEM_DATA */ - if (nftnl_data_cpy(&s->data, data, data_len, 0) < 0) + if (nftnl_data_cpy(&s->data, data, data_len, 0, NULL) < 0) return -1; break; case NFTNL_SET_ELEM_TIMEOUT: /* NFTA_SET_ELEM_TIMEOUT */