]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: deduplicate map with data interval
authorFlorian Westphal <fw@strlen.de>
Wed, 2 Aug 2023 15:48:24 +0000 (17:48 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 23 Jan 2025 00:34:48 +0000 (01:34 +0100)
commit 28d202216535ac54216f825e511a92d9acea5d3c upstream.

Its copypasted, the copy is same as original
except that it specifies a map key that maps to an interval.

Add an exra rule that returns 0 or EXPR_F_INTERVAL, then
use that in a single rule.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/parser_bison.y

index ed1ab2695f1bc87bf5062f9ac7c2fcfca976f13e..6291f4f3ba71fb1bad2ec6171b990a8609c1c77a 100644 (file)
@@ -717,7 +717,7 @@ int nft_lex(void *, void *, void *);
 
 %type <set>                    map_block_alloc map_block
 %destructor { set_free($$); }  map_block_alloc
-%type <val>                    map_block_obj_type
+%type <val>                    map_block_obj_type map_block_data_interval
 
 %type <flowtable>              flowtable_block_alloc flowtable_block
 %destructor { flowtable_free($$); }    flowtable_block_alloc
@@ -2095,6 +2095,10 @@ map_block_obj_type       :       COUNTER close_scope_counter { $$ = NFT_OBJECT_COUNTER; }
                        |       SYNPROXY close_scope_synproxy { $$ = NFT_OBJECT_SYNPROXY; }
                        ;
 
+map_block_data_interval :      INTERVAL { $$ = EXPR_F_INTERVAL; }
+                       |       { $$ = 0; }
+                       ;
+
 map_block              :       /* empty */     { $$ = $<set>-1; }
                        |       map_block       common_block
                        |       map_block       stmt_separator
@@ -2109,17 +2113,7 @@ map_block                :       /* empty */     { $$ = $<set>-1; }
                                $$ = $1;
                        }
                        |       map_block       TYPE
-                                               data_type_expr  COLON   data_type_expr
-                                               stmt_separator  close_scope_type
-                       {
-                               $1->key = $3;
-                               $1->data = $5;
-
-                               $1->flags |= NFT_SET_MAP;
-                               $$ = $1;
-                       }
-                       |       map_block       TYPE
-                                               data_type_expr  COLON   INTERVAL        data_type_expr
+                                               data_type_expr  COLON   map_block_data_interval data_type_expr
                                                stmt_separator  close_scope_type
                        {
                                if (already_set($1->key, &@2, state)) {
@@ -2130,7 +2124,7 @@ map_block         :       /* empty */     { $$ = $<set>-1; }
 
                                $1->key = $3;
                                $1->data = $6;
-                               $1->data->flags |= EXPR_F_INTERVAL;
+                               $1->data->flags |= $5;
 
                                $1->flags |= NFT_SET_MAP;
                                $$ = $1;