]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: compact interval typeof rules
authorFlorian Westphal <fw@strlen.de>
Tue, 27 Feb 2024 14:50:05 +0000 (15:50 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 22 Jan 2025 23:41:55 +0000 (00:41 +0100)
commit 81fc7aee0d523d61077518534036ff10beddb3e9 upstream.

There are two nearly identical blocks for typeof maps:
one with INTERVAL keyword present and one without.

Compact this into a single block.

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

index a6a8f79565ef1d0e147cbbf40b813f71d17946dc..95248aba6bdcfe6cf656d028ba45683f7a5ac8c7 100644 (file)
@@ -778,8 +778,8 @@ int nft_lex(void *, void *, void *);
 
 %type <expr>                   symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
 %destructor { expr_free($$); } symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
-%type <expr>                   primary_expr shift_expr and_expr typeof_expr typeof_data_expr
-%destructor { expr_free($$); } primary_expr shift_expr and_expr typeof_expr typeof_data_expr
+%type <expr>                   primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_verdict_expr
+%destructor { expr_free($$); } primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_verdict_expr
 %type <expr>                   exclusive_or_expr inclusive_or_expr
 %destructor { expr_free($$); } exclusive_or_expr inclusive_or_expr
 %type <expr>                   basic_expr
@@ -1929,7 +1929,7 @@ subchain_block            :       /* empty */     { $$ = $<chain>-1; }
                        }
                        ;
 
-typeof_data_expr       :       primary_expr
+typeof_verdict_expr    :       primary_expr
                        {
                                struct expr *e = $1;
 
@@ -1961,6 +1961,17 @@ typeof_data_expr :       primary_expr
                        }
                        ;
 
+typeof_data_expr       :       INTERVAL        typeof_expr
+                       {
+                               $2->flags |= EXPR_F_INTERVAL;
+                               $$ = $2;
+                       }
+                       |       typeof_verdict_expr
+                       {
+                               $$ = $1;
+                       }
+                       ;
+
 typeof_expr            :       primary_expr
                        {
                                if (expr_ops($1)->build_udata == NULL) {
@@ -2146,23 +2157,6 @@ map_block                :       /* empty */     { $$ = $<set>-1; }
                                $1->flags |= NFT_SET_MAP;
                                $$ = $1;
                        }
-                       |       map_block       TYPEOF
-                                               typeof_expr     COLON   INTERVAL        typeof_expr
-                                               stmt_separator
-                       {
-                               if (already_set($1->key, &@2, state)) {
-                                       expr_free($3);
-                                       expr_free($6);
-                                       YYERROR;
-                               }
-
-                               $1->key = $3;
-                               $1->data = $6;
-                               $1->data->flags |= EXPR_F_INTERVAL;
-
-                               $1->flags |= NFT_SET_MAP;
-                               $$ = $1;
-                       }
                        |       map_block       TYPE
                                                data_type_expr  COLON   map_block_obj_type
                                                stmt_separator  close_scope_type