@@ -4317,13 +4317,44 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
4317
4317
err = nf_tables_set_alloc_name (& ctx , set , name );
4318
4318
kfree (name );
4319
4319
if (err < 0 )
4320
- goto err_set_alloc_name ;
4320
+ goto err_set_name ;
4321
+
4322
+ udata = NULL ;
4323
+ if (udlen ) {
4324
+ udata = set -> data + size ;
4325
+ nla_memcpy (udata , nla [NFTA_SET_USERDATA ], udlen );
4326
+ }
4327
+
4328
+ INIT_LIST_HEAD (& set -> bindings );
4329
+ set -> table = table ;
4330
+ write_pnet (& set -> net , net );
4331
+ set -> ops = ops ;
4332
+ set -> ktype = ktype ;
4333
+ set -> klen = desc .klen ;
4334
+ set -> dtype = dtype ;
4335
+ set -> objtype = objtype ;
4336
+ set -> dlen = desc .dlen ;
4337
+ set -> flags = flags ;
4338
+ set -> size = desc .size ;
4339
+ set -> policy = policy ;
4340
+ set -> udlen = udlen ;
4341
+ set -> udata = udata ;
4342
+ set -> timeout = timeout ;
4343
+ set -> gc_int = gc_int ;
4344
+
4345
+ set -> field_count = desc .field_count ;
4346
+ for (i = 0 ; i < desc .field_count ; i ++ )
4347
+ set -> field_len [i ] = desc .field_len [i ];
4348
+
4349
+ err = ops -> init (set , & desc , nla );
4350
+ if (err < 0 )
4351
+ goto err_set_init ;
4321
4352
4322
4353
if (nla [NFTA_SET_EXPR ]) {
4323
4354
expr = nft_set_elem_expr_alloc (& ctx , set , nla [NFTA_SET_EXPR ]);
4324
4355
if (IS_ERR (expr )) {
4325
4356
err = PTR_ERR (expr );
4326
- goto err_set_alloc_name ;
4357
+ goto err_set_expr_alloc ;
4327
4358
}
4328
4359
set -> exprs [0 ] = expr ;
4329
4360
set -> num_exprs ++ ;
@@ -4334,74 +4365,44 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
4334
4365
4335
4366
if (!(flags & NFT_SET_EXPR )) {
4336
4367
err = - EINVAL ;
4337
- goto err_set_alloc_name ;
4368
+ goto err_set_expr_alloc ;
4338
4369
}
4339
4370
i = 0 ;
4340
4371
nla_for_each_nested (tmp , nla [NFTA_SET_EXPRESSIONS ], left ) {
4341
4372
if (i == NFT_SET_EXPR_MAX ) {
4342
4373
err = - E2BIG ;
4343
- goto err_set_init ;
4374
+ goto err_set_expr_alloc ;
4344
4375
}
4345
4376
if (nla_type (tmp ) != NFTA_LIST_ELEM ) {
4346
4377
err = - EINVAL ;
4347
- goto err_set_init ;
4378
+ goto err_set_expr_alloc ;
4348
4379
}
4349
4380
expr = nft_set_elem_expr_alloc (& ctx , set , tmp );
4350
4381
if (IS_ERR (expr )) {
4351
4382
err = PTR_ERR (expr );
4352
- goto err_set_init ;
4383
+ goto err_set_expr_alloc ;
4353
4384
}
4354
4385
set -> exprs [i ++ ] = expr ;
4355
4386
set -> num_exprs ++ ;
4356
4387
}
4357
4388
}
4358
4389
4359
- udata = NULL ;
4360
- if (udlen ) {
4361
- udata = set -> data + size ;
4362
- nla_memcpy (udata , nla [NFTA_SET_USERDATA ], udlen );
4363
- }
4364
-
4365
- INIT_LIST_HEAD (& set -> bindings );
4366
- set -> table = table ;
4367
- write_pnet (& set -> net , net );
4368
- set -> ops = ops ;
4369
- set -> ktype = ktype ;
4370
- set -> klen = desc .klen ;
4371
- set -> dtype = dtype ;
4372
- set -> objtype = objtype ;
4373
- set -> dlen = desc .dlen ;
4374
- set -> flags = flags ;
4375
- set -> size = desc .size ;
4376
- set -> policy = policy ;
4377
- set -> udlen = udlen ;
4378
- set -> udata = udata ;
4379
- set -> timeout = timeout ;
4380
- set -> gc_int = gc_int ;
4381
4390
set -> handle = nf_tables_alloc_handle (table );
4382
4391
4383
- set -> field_count = desc .field_count ;
4384
- for (i = 0 ; i < desc .field_count ; i ++ )
4385
- set -> field_len [i ] = desc .field_len [i ];
4386
-
4387
- err = ops -> init (set , & desc , nla );
4388
- if (err < 0 )
4389
- goto err_set_init ;
4390
-
4391
4392
err = nft_trans_set_add (& ctx , NFT_MSG_NEWSET , set );
4392
4393
if (err < 0 )
4393
- goto err_set_trans ;
4394
+ goto err_set_expr_alloc ;
4394
4395
4395
4396
list_add_tail_rcu (& set -> list , & table -> sets );
4396
4397
table -> use ++ ;
4397
4398
return 0 ;
4398
4399
4399
- err_set_trans :
4400
- ops -> destroy (set );
4401
- err_set_init :
4400
+ err_set_expr_alloc :
4402
4401
for (i = 0 ; i < set -> num_exprs ; i ++ )
4403
4402
nft_expr_destroy (& ctx , set -> exprs [i ]);
4404
- err_set_alloc_name :
4403
+
4404
+ ops -> destroy (set );
4405
+ err_set_init :
4405
4406
kfree (set -> name );
4406
4407
err_set_name :
4407
4408
kvfree (set );
0 commit comments