@@ -4280,15 +4280,7 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
4280
4280
err = nf_tables_set_alloc_name (& ctx , set , name );
4281
4281
kfree (name );
4282
4282
if (err < 0 )
4283
- goto err_set_alloc_name ;
4284
-
4285
- if (nla [NFTA_SET_EXPR ]) {
4286
- expr = nft_set_elem_expr_alloc (& ctx , set , nla [NFTA_SET_EXPR ]);
4287
- if (IS_ERR (expr )) {
4288
- err = PTR_ERR (expr );
4289
- goto err_set_alloc_name ;
4290
- }
4291
- }
4283
+ goto err_set_name ;
4292
4284
4293
4285
udata = NULL ;
4294
4286
if (udlen ) {
@@ -4299,21 +4291,19 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
4299
4291
INIT_LIST_HEAD (& set -> bindings );
4300
4292
set -> table = table ;
4301
4293
write_pnet (& set -> net , net );
4302
- set -> ops = ops ;
4294
+ set -> ops = ops ;
4303
4295
set -> ktype = ktype ;
4304
- set -> klen = desc .klen ;
4296
+ set -> klen = desc .klen ;
4305
4297
set -> dtype = dtype ;
4306
4298
set -> objtype = objtype ;
4307
- set -> dlen = desc .dlen ;
4308
- set -> expr = expr ;
4299
+ set -> dlen = desc .dlen ;
4309
4300
set -> flags = flags ;
4310
- set -> size = desc .size ;
4301
+ set -> size = desc .size ;
4311
4302
set -> policy = policy ;
4312
- set -> udlen = udlen ;
4313
- set -> udata = udata ;
4303
+ set -> udlen = udlen ;
4304
+ set -> udata = udata ;
4314
4305
set -> timeout = timeout ;
4315
4306
set -> gc_int = gc_int ;
4316
- set -> handle = nf_tables_alloc_handle (table );
4317
4307
4318
4308
set -> field_count = desc .field_count ;
4319
4309
for (i = 0 ; i < desc .field_count ; i ++ )
@@ -4323,20 +4313,32 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
4323
4313
if (err < 0 )
4324
4314
goto err_set_init ;
4325
4315
4316
+ if (nla [NFTA_SET_EXPR ]) {
4317
+ expr = nft_set_elem_expr_alloc (& ctx , set , nla [NFTA_SET_EXPR ]);
4318
+ if (IS_ERR (expr )) {
4319
+ err = PTR_ERR (expr );
4320
+ goto err_set_expr_alloc ;
4321
+ }
4322
+
4323
+ set -> expr = expr ;
4324
+ }
4325
+
4326
+ set -> handle = nf_tables_alloc_handle (table );
4327
+
4326
4328
err = nft_trans_set_add (& ctx , NFT_MSG_NEWSET , set );
4327
4329
if (err < 0 )
4328
- goto err_set_trans ;
4330
+ goto err_set_expr_alloc ;
4329
4331
4330
4332
list_add_tail_rcu (& set -> list , & table -> sets );
4331
4333
table -> use ++ ;
4332
4334
return 0 ;
4333
4335
4334
- err_set_trans :
4336
+ err_set_expr_alloc :
4337
+ if (set -> expr )
4338
+ nft_expr_destroy (& ctx , set -> expr );
4339
+
4335
4340
ops -> destroy (set );
4336
4341
err_set_init :
4337
- if (expr )
4338
- nft_expr_destroy (& ctx , expr );
4339
- err_set_alloc_name :
4340
4342
kfree (set -> name );
4341
4343
err_set_name :
4342
4344
kvfree (set );
0 commit comments