@@ -5295,16 +5295,35 @@ int nft_set_elem_expr_clone(const struct nft_ctx *ctx, struct nft_set *set,
5295
5295
return - ENOMEM ;
5296
5296
}
5297
5297
5298
- static void nft_set_elem_expr_setup (const struct nft_set_ext * ext , int i ,
5299
- struct nft_expr * expr_array [])
5298
+ static int nft_set_elem_expr_setup (struct nft_ctx * ctx ,
5299
+ const struct nft_set_ext * ext ,
5300
+ struct nft_expr * expr_array [],
5301
+ u32 num_exprs )
5300
5302
{
5301
5303
struct nft_set_elem_expr * elem_expr = nft_set_ext_expr (ext );
5302
- struct nft_expr * expr = nft_setelem_expr_at (elem_expr , elem_expr -> size );
5304
+ struct nft_expr * expr ;
5305
+ int i , err ;
5306
+
5307
+ for (i = 0 ; i < num_exprs ; i ++ ) {
5308
+ expr = nft_setelem_expr_at (elem_expr , elem_expr -> size );
5309
+ err = nft_expr_clone (expr , expr_array [i ]);
5310
+ if (err < 0 )
5311
+ goto err_elem_expr_setup ;
5312
+
5313
+ elem_expr -> size += expr_array [i ]-> ops -> size ;
5314
+ nft_expr_destroy (ctx , expr_array [i ]);
5315
+ expr_array [i ] = NULL ;
5316
+ }
5317
+
5318
+ return 0 ;
5319
+
5320
+ err_elem_expr_setup :
5321
+ for (; i < num_exprs ; i ++ ) {
5322
+ nft_expr_destroy (ctx , expr_array [i ]);
5323
+ expr_array [i ] = NULL ;
5324
+ }
5303
5325
5304
- memcpy (expr , expr_array [i ], expr_array [i ]-> ops -> size );
5305
- elem_expr -> size += expr_array [i ]-> ops -> size ;
5306
- kfree (expr_array [i ]);
5307
- expr_array [i ] = NULL ;
5326
+ return - ENOMEM ;
5308
5327
}
5309
5328
5310
5329
static int nft_add_set_elem (struct nft_ctx * ctx , struct nft_set * set ,
@@ -5556,12 +5575,15 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
5556
5575
* nft_set_ext_obj (ext ) = obj ;
5557
5576
obj -> use ++ ;
5558
5577
}
5559
- for (i = 0 ; i < num_exprs ; i ++ )
5560
- nft_set_elem_expr_setup (ext , i , expr_array );
5578
+ err = nft_set_elem_expr_setup (ctx , ext , expr_array , num_exprs );
5579
+ if (err < 0 )
5580
+ goto err_elem_expr ;
5561
5581
5562
5582
trans = nft_trans_elem_alloc (ctx , NFT_MSG_NEWSETELEM , set );
5563
- if (trans == NULL )
5564
- goto err_trans ;
5583
+ if (trans == NULL ) {
5584
+ err = - ENOMEM ;
5585
+ goto err_elem_expr ;
5586
+ }
5565
5587
5566
5588
ext -> genmask = nft_genmask_cur (ctx -> net ) | NFT_SET_ELEM_BUSY_MASK ;
5567
5589
err = set -> ops -> insert (ctx -> net , set , & elem , & ext2 );
@@ -5605,7 +5627,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
5605
5627
set -> ops -> remove (ctx -> net , set , & elem );
5606
5628
err_element_clash :
5607
5629
kfree (trans );
5608
- err_trans :
5630
+ err_elem_expr :
5609
5631
if (obj )
5610
5632
obj -> use -- ;
5611
5633
0 commit comments