Skip to content

Commit 36983fc

Browse files
ummakynesgregkh
authored andcommitted
netfilter: nf_tables: initialize set before expression setup
commit ad9f151 upstream. nft_set_elem_expr_alloc() needs an initialized set if expression sets on the NFT_EXPR_GC flag. Move set fields initialization before expression setup. [4512935.019450] ================================================================== [4512935.019456] BUG: KASAN: null-ptr-deref in nft_set_elem_expr_alloc+0x84/0xd0 [nf_tables] [4512935.019487] Read of size 8 at addr 0000000000000070 by task nft/23532 [4512935.019494] CPU: 1 PID: 23532 Comm: nft Not tainted 5.12.0-rc4+ raspberrypi#48 [...] [4512935.019502] Call Trace: [4512935.019505] dump_stack+0x89/0xb4 [4512935.019512] ? nft_set_elem_expr_alloc+0x84/0xd0 [nf_tables] [4512935.019536] ? nft_set_elem_expr_alloc+0x84/0xd0 [nf_tables] [4512935.019560] kasan_report.cold.12+0x5f/0xd8 [4512935.019566] ? nft_set_elem_expr_alloc+0x84/0xd0 [nf_tables] [4512935.019590] nft_set_elem_expr_alloc+0x84/0xd0 [nf_tables] [4512935.019615] nf_tables_newset+0xc7f/0x1460 [nf_tables] Reported-by: [email protected] Fixes: 6503842 ("netfilter: nf_tables: allow to specify stateful expression in set definition") Signed-off-by: Pablo Neira Ayuso <[email protected]> Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 3fda454 commit 36983fc

File tree

1 file changed

+24
-22
lines changed

1 file changed

+24
-22
lines changed

net/netfilter/nf_tables_api.c

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4280,15 +4280,7 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
42804280
err = nf_tables_set_alloc_name(&ctx, set, name);
42814281
kfree(name);
42824282
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;
42924284

42934285
udata = NULL;
42944286
if (udlen) {
@@ -4299,21 +4291,19 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
42994291
INIT_LIST_HEAD(&set->bindings);
43004292
set->table = table;
43014293
write_pnet(&set->net, net);
4302-
set->ops = ops;
4294+
set->ops = ops;
43034295
set->ktype = ktype;
4304-
set->klen = desc.klen;
4296+
set->klen = desc.klen;
43054297
set->dtype = dtype;
43064298
set->objtype = objtype;
4307-
set->dlen = desc.dlen;
4308-
set->expr = expr;
4299+
set->dlen = desc.dlen;
43094300
set->flags = flags;
4310-
set->size = desc.size;
4301+
set->size = desc.size;
43114302
set->policy = policy;
4312-
set->udlen = udlen;
4313-
set->udata = udata;
4303+
set->udlen = udlen;
4304+
set->udata = udata;
43144305
set->timeout = timeout;
43154306
set->gc_int = gc_int;
4316-
set->handle = nf_tables_alloc_handle(table);
43174307

43184308
set->field_count = desc.field_count;
43194309
for (i = 0; i < desc.field_count; i++)
@@ -4323,20 +4313,32 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
43234313
if (err < 0)
43244314
goto err_set_init;
43254315

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+
43264328
err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
43274329
if (err < 0)
4328-
goto err_set_trans;
4330+
goto err_set_expr_alloc;
43294331

43304332
list_add_tail_rcu(&set->list, &table->sets);
43314333
table->use++;
43324334
return 0;
43334335

4334-
err_set_trans:
4336+
err_set_expr_alloc:
4337+
if (set->expr)
4338+
nft_expr_destroy(&ctx, set->expr);
4339+
43354340
ops->destroy(set);
43364341
err_set_init:
4337-
if (expr)
4338-
nft_expr_destroy(&ctx, expr);
4339-
err_set_alloc_name:
43404342
kfree(set->name);
43414343
err_set_name:
43424344
kvfree(set);

0 commit comments

Comments
 (0)