@@ -4364,13 +4364,45 @@ static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
4364
4364
err = nf_tables_set_alloc_name (& ctx , set , name );
4365
4365
kfree (name );
4366
4366
if (err < 0 )
4367
- goto err_set_alloc_name ;
4367
+ goto err_set_name ;
4368
+
4369
+ udata = NULL ;
4370
+ if (udlen ) {
4371
+ udata = set -> data + size ;
4372
+ nla_memcpy (udata , nla [NFTA_SET_USERDATA ], udlen );
4373
+ }
4374
+
4375
+ INIT_LIST_HEAD (& set -> bindings );
4376
+ INIT_LIST_HEAD (& set -> catchall_list );
4377
+ set -> table = table ;
4378
+ write_pnet (& set -> net , net );
4379
+ set -> ops = ops ;
4380
+ set -> ktype = ktype ;
4381
+ set -> klen = desc .klen ;
4382
+ set -> dtype = dtype ;
4383
+ set -> objtype = objtype ;
4384
+ set -> dlen = desc .dlen ;
4385
+ set -> flags = flags ;
4386
+ set -> size = desc .size ;
4387
+ set -> policy = policy ;
4388
+ set -> udlen = udlen ;
4389
+ set -> udata = udata ;
4390
+ set -> timeout = timeout ;
4391
+ set -> gc_int = gc_int ;
4392
+
4393
+ set -> field_count = desc .field_count ;
4394
+ for (i = 0 ; i < desc .field_count ; i ++ )
4395
+ set -> field_len [i ] = desc .field_len [i ];
4396
+
4397
+ err = ops -> init (set , & desc , nla );
4398
+ if (err < 0 )
4399
+ goto err_set_init ;
4368
4400
4369
4401
if (nla [NFTA_SET_EXPR ]) {
4370
4402
expr = nft_set_elem_expr_alloc (& ctx , set , nla [NFTA_SET_EXPR ]);
4371
4403
if (IS_ERR (expr )) {
4372
4404
err = PTR_ERR (expr );
4373
- goto err_set_alloc_name ;
4405
+ goto err_set_expr_alloc ;
4374
4406
}
4375
4407
set -> exprs [0 ] = expr ;
4376
4408
set -> num_exprs ++ ;
@@ -4381,75 +4413,44 @@ static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
4381
4413
4382
4414
if (!(flags & NFT_SET_EXPR )) {
4383
4415
err = - EINVAL ;
4384
- goto err_set_alloc_name ;
4416
+ goto err_set_expr_alloc ;
4385
4417
}
4386
4418
i = 0 ;
4387
4419
nla_for_each_nested (tmp , nla [NFTA_SET_EXPRESSIONS ], left ) {
4388
4420
if (i == NFT_SET_EXPR_MAX ) {
4389
4421
err = - E2BIG ;
4390
- goto err_set_init ;
4422
+ goto err_set_expr_alloc ;
4391
4423
}
4392
4424
if (nla_type (tmp ) != NFTA_LIST_ELEM ) {
4393
4425
err = - EINVAL ;
4394
- goto err_set_init ;
4426
+ goto err_set_expr_alloc ;
4395
4427
}
4396
4428
expr = nft_set_elem_expr_alloc (& ctx , set , tmp );
4397
4429
if (IS_ERR (expr )) {
4398
4430
err = PTR_ERR (expr );
4399
- goto err_set_init ;
4431
+ goto err_set_expr_alloc ;
4400
4432
}
4401
4433
set -> exprs [i ++ ] = expr ;
4402
4434
set -> num_exprs ++ ;
4403
4435
}
4404
4436
}
4405
4437
4406
- udata = NULL ;
4407
- if (udlen ) {
4408
- udata = set -> data + size ;
4409
- nla_memcpy (udata , nla [NFTA_SET_USERDATA ], udlen );
4410
- }
4411
-
4412
- INIT_LIST_HEAD (& set -> bindings );
4413
- INIT_LIST_HEAD (& set -> catchall_list );
4414
- set -> table = table ;
4415
- write_pnet (& set -> net , net );
4416
- set -> ops = ops ;
4417
- set -> ktype = ktype ;
4418
- set -> klen = desc .klen ;
4419
- set -> dtype = dtype ;
4420
- set -> objtype = objtype ;
4421
- set -> dlen = desc .dlen ;
4422
- set -> flags = flags ;
4423
- set -> size = desc .size ;
4424
- set -> policy = policy ;
4425
- set -> udlen = udlen ;
4426
- set -> udata = udata ;
4427
- set -> timeout = timeout ;
4428
- set -> gc_int = gc_int ;
4429
4438
set -> handle = nf_tables_alloc_handle (table );
4430
4439
4431
- set -> field_count = desc .field_count ;
4432
- for (i = 0 ; i < desc .field_count ; i ++ )
4433
- set -> field_len [i ] = desc .field_len [i ];
4434
-
4435
- err = ops -> init (set , & desc , nla );
4436
- if (err < 0 )
4437
- goto err_set_init ;
4438
-
4439
4440
err = nft_trans_set_add (& ctx , NFT_MSG_NEWSET , set );
4440
4441
if (err < 0 )
4441
- goto err_set_trans ;
4442
+ goto err_set_expr_alloc ;
4442
4443
4443
4444
list_add_tail_rcu (& set -> list , & table -> sets );
4444
4445
table -> use ++ ;
4445
4446
return 0 ;
4446
4447
4447
- err_set_trans :
4448
- ops -> destroy (set );
4449
- err_set_init :
4448
+ err_set_expr_alloc :
4450
4449
for (i = 0 ; i < set -> num_exprs ; i ++ )
4451
4450
nft_expr_destroy (& ctx , set -> exprs [i ]);
4452
- err_set_alloc_name :
4451
+
4452
+ ops -> destroy (set );
4453
+ err_set_init :
4453
4454
kfree (set -> name );
4454
4455
err_set_name :
4455
4456
kvfree (set );
0 commit comments