]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink: restore typeof interval map data type
authorFlorian Westphal <fw@strlen.de>
Mon, 1 May 2023 16:51:19 +0000 (18:51 +0200)
committerFlorian Westphal <fw@strlen.de>
Tue, 2 May 2023 17:18:07 +0000 (19:18 +0200)
When "typeof ... : interval ..." gets used, existing logic
failed to validate the expressions.

"interval" means that kernel reserves twice the size,
so consider this when validating and restoring.

Also fix up the dump file of the existing test
case to be symmetrical.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/netlink.c
tests/shell/testcases/sets/dumps/0067nat_concat_interval_0.nft

index f1452d48f42401f361cb3a352089b38c7fcf4184..3352ad0abb61064e4bd1b30b8d2d349b688900b8 100644 (file)
@@ -1024,10 +1024,15 @@ struct set *netlink_delinearize_set(struct netlink_ctx *ctx,
        list_splice_tail(&set_parse_ctx.stmt_list, &set->stmt_list);
 
        if (datatype) {
+               uint32_t dlen;
+
                dtype = set_datatype_alloc(datatype, databyteorder);
                klen = nftnl_set_get_u32(nls, NFTNL_SET_DATA_LEN) * BITS_PER_BYTE;
 
-               if (set_udata_key_valid(typeof_expr_data, klen)) {
+               dlen = data_interval ?  klen / 2 : klen;
+
+               if (set_udata_key_valid(typeof_expr_data, dlen)) {
+                       typeof_expr_data->len = klen;
                        datatype_free(datatype_get(dtype));
                        set->data = typeof_expr_data;
                } else {
index 6af47c6682cec363ce235b923b9ec948247cac47..0215691e28eec2f9ccc49ba542f0eeba36f4f155 100644 (file)
@@ -18,14 +18,14 @@ table ip nat {
        }
 
        map ipportmap4 {
-               type ifname . ipv4_addr : interval ipv4_addr
+               typeof iifname . ip saddr : interval ip daddr
                flags interval
                elements = { "enp2s0" . 10.1.1.136 : 1.1.2.69/32,
                             "enp2s0" . 10.1.1.1-10.1.1.135 : 1.1.2.66-1.84.236.78 }
        }
 
        map ipportmap5 {
-               type ifname . ipv4_addr : interval ipv4_addr . inet_service
+               typeof iifname . ip saddr : interval ip daddr . tcp dport
                flags interval
                elements = { "enp2s0" . 10.1.1.136 : 1.1.2.69 . 22,
                             "enp2s0" . 10.1.1.1-10.1.1.135 : 1.1.2.66-1.84.236.78 . 22 }