@@ -102,11 +102,9 @@ static const u8 nft2audit_op[NFT_MSG_MAX] = { // enum nf_tables_msg_types
102
102
[NFT_MSG_DELFLOWTABLE ] = AUDIT_NFT_OP_FLOWTABLE_UNREGISTER ,
103
103
};
104
104
105
- static void nft_validate_state_update (struct net * net , u8 new_validate_state )
105
+ static void nft_validate_state_update (struct nft_table * table , u8 new_validate_state )
106
106
{
107
- struct nftables_pernet * nft_net = nft_pernet (net );
108
-
109
- switch (nft_net -> validate_state ) {
107
+ switch (table -> validate_state ) {
110
108
case NFT_VALIDATE_SKIP :
111
109
WARN_ON_ONCE (new_validate_state == NFT_VALIDATE_DO );
112
110
break ;
@@ -117,7 +115,7 @@ static void nft_validate_state_update(struct net *net, u8 new_validate_state)
117
115
return ;
118
116
}
119
117
120
- nft_net -> validate_state = new_validate_state ;
118
+ table -> validate_state = new_validate_state ;
121
119
}
122
120
static void nf_tables_trans_destroy_work (struct work_struct * w );
123
121
static DECLARE_WORK (trans_destroy_work , nf_tables_trans_destroy_work ) ;
@@ -1224,6 +1222,7 @@ static int nf_tables_newtable(struct sk_buff *skb, const struct nfnl_info *info,
1224
1222
if (table == NULL )
1225
1223
goto err_kzalloc ;
1226
1224
1225
+ table -> validate_state = NFT_VALIDATE_SKIP ;
1227
1226
table -> name = nla_strdup (attr , GFP_KERNEL_ACCOUNT );
1228
1227
if (table -> name == NULL )
1229
1228
goto err_strdup ;
@@ -3660,7 +3659,7 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
3660
3659
}
3661
3660
3662
3661
if (expr_info [i ].ops -> validate )
3663
- nft_validate_state_update (net , NFT_VALIDATE_NEED );
3662
+ nft_validate_state_update (table , NFT_VALIDATE_NEED );
3664
3663
3665
3664
expr_info [i ].ops = NULL ;
3666
3665
expr = nft_expr_next (expr );
@@ -3710,7 +3709,7 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
3710
3709
if (flow )
3711
3710
nft_trans_flow_rule (trans ) = flow ;
3712
3711
3713
- if (nft_net -> validate_state == NFT_VALIDATE_DO )
3712
+ if (table -> validate_state == NFT_VALIDATE_DO )
3714
3713
return nft_table_validate (net , table );
3715
3714
3716
3715
return 0 ;
@@ -6312,7 +6311,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
6312
6311
if (desc .type == NFT_DATA_VERDICT &&
6313
6312
(elem .data .val .verdict .code == NFT_GOTO ||
6314
6313
elem .data .val .verdict .code == NFT_JUMP ))
6315
- nft_validate_state_update (ctx -> net ,
6314
+ nft_validate_state_update (ctx -> table ,
6316
6315
NFT_VALIDATE_NEED );
6317
6316
}
6318
6317
@@ -6437,7 +6436,6 @@ static int nf_tables_newsetelem(struct sk_buff *skb,
6437
6436
const struct nfnl_info * info ,
6438
6437
const struct nlattr * const nla [])
6439
6438
{
6440
- struct nftables_pernet * nft_net = nft_pernet (info -> net );
6441
6439
struct netlink_ext_ack * extack = info -> extack ;
6442
6440
u8 genmask = nft_genmask_next (info -> net );
6443
6441
u8 family = info -> nfmsg -> nfgen_family ;
@@ -6476,7 +6474,7 @@ static int nf_tables_newsetelem(struct sk_buff *skb,
6476
6474
}
6477
6475
}
6478
6476
6479
- if (nft_net -> validate_state == NFT_VALIDATE_DO )
6477
+ if (table -> validate_state == NFT_VALIDATE_DO )
6480
6478
return nft_table_validate (net , table );
6481
6479
6482
6480
return 0 ;
@@ -8628,19 +8626,20 @@ static int nf_tables_validate(struct net *net)
8628
8626
struct nftables_pernet * nft_net = nft_pernet (net );
8629
8627
struct nft_table * table ;
8630
8628
8631
- switch ( nft_net -> validate_state ) {
8632
- case NFT_VALIDATE_SKIP :
8633
- break ;
8634
- case NFT_VALIDATE_NEED :
8635
- nft_validate_state_update ( net , NFT_VALIDATE_DO );
8636
- fallthrough ;
8637
- case NFT_VALIDATE_DO :
8638
- list_for_each_entry ( table , & nft_net -> tables , list ) {
8629
+ list_for_each_entry ( table , & nft_net -> tables , list ) {
8630
+ switch ( table -> validate_state ) {
8631
+ case NFT_VALIDATE_SKIP :
8632
+ continue ;
8633
+ case NFT_VALIDATE_NEED :
8634
+ nft_validate_state_update ( table , NFT_VALIDATE_DO ) ;
8635
+ fallthrough ;
8636
+ case NFT_VALIDATE_DO :
8639
8637
if (nft_table_validate (net , table ) < 0 )
8640
8638
return - EAGAIN ;
8639
+
8640
+ nft_validate_state_update (table , NFT_VALIDATE_SKIP );
8641
8641
}
8642
8642
8643
- nft_validate_state_update (net , NFT_VALIDATE_SKIP );
8644
8643
break ;
8645
8644
}
8646
8645
@@ -10355,7 +10354,6 @@ static int __net_init nf_tables_init_net(struct net *net)
10355
10354
INIT_LIST_HEAD (& nft_net -> notify_list );
10356
10355
mutex_init (& nft_net -> commit_mutex );
10357
10356
nft_net -> base_seq = 1 ;
10358
- nft_net -> validate_state = NFT_VALIDATE_SKIP ;
10359
10357
10360
10358
return 0 ;
10361
10359
}
0 commit comments