@@ -4524,11 +4524,28 @@ static int nft_setelem_parse_flags(const struct nft_set *set,
4524
4524
return 0 ;
4525
4525
}
4526
4526
4527
+ static int nft_setelem_parse_key (struct nft_ctx * ctx , struct nft_set * set ,
4528
+ struct nft_data * key , struct nlattr * attr )
4529
+ {
4530
+ struct nft_data_desc desc ;
4531
+ int err ;
4532
+
4533
+ err = nft_data_init (ctx , key , NFT_DATA_VALUE_MAXLEN , & desc , attr );
4534
+ if (err < 0 )
4535
+ return err ;
4536
+
4537
+ if (desc .type != NFT_DATA_VALUE || desc .len != set -> klen ) {
4538
+ nft_data_release (key , desc .type );
4539
+ return - EINVAL ;
4540
+ }
4541
+
4542
+ return 0 ;
4543
+ }
4544
+
4527
4545
static int nft_get_set_elem (struct nft_ctx * ctx , struct nft_set * set ,
4528
4546
const struct nlattr * attr )
4529
4547
{
4530
4548
struct nlattr * nla [NFTA_SET_ELEM_MAX + 1 ];
4531
- struct nft_data_desc desc ;
4532
4549
struct nft_set_elem elem ;
4533
4550
struct sk_buff * skb ;
4534
4551
uint32_t flags = 0 ;
@@ -4547,17 +4564,11 @@ static int nft_get_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4547
4564
if (err < 0 )
4548
4565
return err ;
4549
4566
4550
- err = nft_data_init (ctx , & elem .key .val , sizeof ( elem . key ), & desc ,
4551
- nla [NFTA_SET_ELEM_KEY ]);
4567
+ err = nft_setelem_parse_key (ctx , set , & elem .key .val ,
4568
+ nla [NFTA_SET_ELEM_KEY ]);
4552
4569
if (err < 0 )
4553
4570
return err ;
4554
4571
4555
- err = - EINVAL ;
4556
- if (desc .type != NFT_DATA_VALUE || desc .len != set -> klen ) {
4557
- nft_data_release (& elem .key .val , desc .type );
4558
- return err ;
4559
- }
4560
-
4561
4572
priv = set -> ops -> get (ctx -> net , set , & elem , flags );
4562
4573
if (IS_ERR (priv ))
4563
4574
return PTR_ERR (priv );
@@ -4756,13 +4767,13 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4756
4767
{
4757
4768
struct nlattr * nla [NFTA_SET_ELEM_MAX + 1 ];
4758
4769
u8 genmask = nft_genmask_next (ctx -> net );
4759
- struct nft_data_desc d1 , d2 ;
4760
4770
struct nft_set_ext_tmpl tmpl ;
4761
4771
struct nft_set_ext * ext , * ext2 ;
4762
4772
struct nft_set_elem elem ;
4763
4773
struct nft_set_binding * binding ;
4764
4774
struct nft_object * obj = NULL ;
4765
4775
struct nft_userdata * udata ;
4776
+ struct nft_data_desc desc ;
4766
4777
struct nft_data data ;
4767
4778
enum nft_registers dreg ;
4768
4779
struct nft_trans * trans ;
@@ -4828,15 +4839,12 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4828
4839
return err ;
4829
4840
}
4830
4841
4831
- err = nft_data_init (ctx , & elem .key .val , sizeof ( elem . key ), & d1 ,
4832
- nla [NFTA_SET_ELEM_KEY ]);
4842
+ err = nft_setelem_parse_key (ctx , set , & elem .key .val ,
4843
+ nla [NFTA_SET_ELEM_KEY ]);
4833
4844
if (err < 0 )
4834
4845
goto err1 ;
4835
- err = - EINVAL ;
4836
- if (d1 .type != NFT_DATA_VALUE || d1 .len != set -> klen )
4837
- goto err2 ;
4838
4846
4839
- nft_set_ext_add_length (& tmpl , NFT_SET_EXT_KEY , d1 . len );
4847
+ nft_set_ext_add_length (& tmpl , NFT_SET_EXT_KEY , set -> klen );
4840
4848
if (timeout > 0 ) {
4841
4849
nft_set_ext_add (& tmpl , NFT_SET_EXT_EXPIRATION );
4842
4850
if (timeout != set -> timeout )
@@ -4859,13 +4867,13 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4859
4867
}
4860
4868
4861
4869
if (nla [NFTA_SET_ELEM_DATA ] != NULL ) {
4862
- err = nft_data_init (ctx , & data , sizeof (data ), & d2 ,
4870
+ err = nft_data_init (ctx , & data , sizeof (data ), & desc ,
4863
4871
nla [NFTA_SET_ELEM_DATA ]);
4864
4872
if (err < 0 )
4865
4873
goto err2 ;
4866
4874
4867
4875
err = - EINVAL ;
4868
- if (set -> dtype != NFT_DATA_VERDICT && d2 .len != set -> dlen )
4876
+ if (set -> dtype != NFT_DATA_VERDICT && desc .len != set -> dlen )
4869
4877
goto err3 ;
4870
4878
4871
4879
dreg = nft_type_to_reg (set -> dtype );
@@ -4882,18 +4890,18 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4882
4890
4883
4891
err = nft_validate_register_store (& bind_ctx , dreg ,
4884
4892
& data ,
4885
- d2 .type , d2 .len );
4893
+ desc .type , desc .len );
4886
4894
if (err < 0 )
4887
4895
goto err3 ;
4888
4896
4889
- if (d2 .type == NFT_DATA_VERDICT &&
4897
+ if (desc .type == NFT_DATA_VERDICT &&
4890
4898
(data .verdict .code == NFT_GOTO ||
4891
4899
data .verdict .code == NFT_JUMP ))
4892
4900
nft_validate_state_update (ctx -> net ,
4893
4901
NFT_VALIDATE_NEED );
4894
4902
}
4895
4903
4896
- nft_set_ext_add_length (& tmpl , NFT_SET_EXT_DATA , d2 .len );
4904
+ nft_set_ext_add_length (& tmpl , NFT_SET_EXT_DATA , desc .len );
4897
4905
}
4898
4906
4899
4907
/* The full maximum length of userdata can exceed the maximum
@@ -4976,9 +4984,9 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4976
4984
kfree (elem .priv );
4977
4985
err3 :
4978
4986
if (nla [NFTA_SET_ELEM_DATA ] != NULL )
4979
- nft_data_release (& data , d2 .type );
4987
+ nft_data_release (& data , desc .type );
4980
4988
err2 :
4981
- nft_data_release (& elem .key .val , d1 . type );
4989
+ nft_data_release (& elem .key .val , NFT_DATA_VALUE );
4982
4990
err1 :
4983
4991
return err ;
4984
4992
}
@@ -5074,7 +5082,6 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
5074
5082
{
5075
5083
struct nlattr * nla [NFTA_SET_ELEM_MAX + 1 ];
5076
5084
struct nft_set_ext_tmpl tmpl ;
5077
- struct nft_data_desc desc ;
5078
5085
struct nft_set_elem elem ;
5079
5086
struct nft_set_ext * ext ;
5080
5087
struct nft_trans * trans ;
@@ -5085,11 +5092,10 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
5085
5092
err = nla_parse_nested_deprecated (nla , NFTA_SET_ELEM_MAX , attr ,
5086
5093
nft_set_elem_policy , NULL );
5087
5094
if (err < 0 )
5088
- goto err1 ;
5095
+ return err ;
5089
5096
5090
- err = - EINVAL ;
5091
5097
if (nla [NFTA_SET_ELEM_KEY ] == NULL )
5092
- goto err1 ;
5098
+ return - EINVAL ;
5093
5099
5094
5100
nft_set_ext_prepare (& tmpl );
5095
5101
@@ -5099,37 +5105,31 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
5099
5105
if (flags != 0 )
5100
5106
nft_set_ext_add (& tmpl , NFT_SET_EXT_FLAGS );
5101
5107
5102
- err = nft_data_init (ctx , & elem .key .val , sizeof ( elem . key ), & desc ,
5103
- nla [NFTA_SET_ELEM_KEY ]);
5108
+ err = nft_setelem_parse_key (ctx , set , & elem .key .val ,
5109
+ nla [NFTA_SET_ELEM_KEY ]);
5104
5110
if (err < 0 )
5105
- goto err1 ;
5106
-
5107
- err = - EINVAL ;
5108
- if (desc .type != NFT_DATA_VALUE || desc .len != set -> klen )
5109
- goto err2 ;
5111
+ return err ;
5110
5112
5111
- nft_set_ext_add_length (& tmpl , NFT_SET_EXT_KEY , desc . len );
5113
+ nft_set_ext_add_length (& tmpl , NFT_SET_EXT_KEY , set -> klen );
5112
5114
5113
5115
err = - ENOMEM ;
5114
5116
elem .priv = nft_set_elem_init (set , & tmpl , elem .key .val .data , NULL , 0 ,
5115
5117
0 , GFP_KERNEL );
5116
5118
if (elem .priv == NULL )
5117
- goto err2 ;
5119
+ goto fail_elem ;
5118
5120
5119
5121
ext = nft_set_elem_ext (set , elem .priv );
5120
5122
if (flags )
5121
5123
* nft_set_ext_flags (ext ) = flags ;
5122
5124
5123
5125
trans = nft_trans_elem_alloc (ctx , NFT_MSG_DELSETELEM , set );
5124
- if (trans == NULL ) {
5125
- err = - ENOMEM ;
5126
- goto err3 ;
5127
- }
5126
+ if (trans == NULL )
5127
+ goto fail_trans ;
5128
5128
5129
5129
priv = set -> ops -> deactivate (ctx -> net , set , & elem );
5130
5130
if (priv == NULL ) {
5131
5131
err = - ENOENT ;
5132
- goto err4 ;
5132
+ goto fail_ops ;
5133
5133
}
5134
5134
kfree (elem .priv );
5135
5135
elem .priv = priv ;
@@ -5140,13 +5140,12 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
5140
5140
list_add_tail (& trans -> list , & ctx -> net -> nft .commit_list );
5141
5141
return 0 ;
5142
5142
5143
- err4 :
5143
+ fail_ops :
5144
5144
kfree (trans );
5145
- err3 :
5145
+ fail_trans :
5146
5146
kfree (elem .priv );
5147
- err2 :
5148
- nft_data_release (& elem .key .val , desc .type );
5149
- err1 :
5147
+ fail_elem :
5148
+ nft_data_release (& elem .key .val , NFT_DATA_VALUE );
5150
5149
return err ;
5151
5150
}
5152
5151
0 commit comments