Skip to content

Commit 5e1be4c

Browse files
author
Florian Westphal
committed
netfilter: nf_tables: fix out of memory error handling
Several instances of pipapo_resize() don't propagate allocation failures, this causes a crash when fault injection is enabled for gfp_kernel slabs. Fixes: 3c4287f ("nf_tables: Add set type for arbitrary concatenation of ranges") Signed-off-by: Florian Westphal <fw@strlen.de> Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
1 parent 8357bc9 commit 5e1be4c

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

net/netfilter/nft_set_pipapo.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -902,12 +902,14 @@ static void pipapo_lt_bits_adjust(struct nft_pipapo_field *f)
902902
static int pipapo_insert(struct nft_pipapo_field *f, const uint8_t *k,
903903
int mask_bits)
904904
{
905-
int rule = f->rules++, group, ret, bit_offset = 0;
905+
int rule = f->rules, group, ret, bit_offset = 0;
906906

907-
ret = pipapo_resize(f, f->rules - 1, f->rules);
907+
ret = pipapo_resize(f, f->rules, f->rules + 1);
908908
if (ret)
909909
return ret;
910910

911+
f->rules++;
912+
911913
for (group = 0; group < f->groups; group++) {
912914
int i, v;
913915
u8 mask;
@@ -1052,7 +1054,9 @@ static int pipapo_expand(struct nft_pipapo_field *f,
10521054
step++;
10531055
if (step >= len) {
10541056
if (!masks) {
1055-
pipapo_insert(f, base, 0);
1057+
err = pipapo_insert(f, base, 0);
1058+
if (err < 0)
1059+
return err;
10561060
masks = 1;
10571061
}
10581062
goto out;
@@ -1235,6 +1239,9 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
12351239
else
12361240
ret = pipapo_expand(f, start, end, f->groups * f->bb);
12371241

1242+
if (ret < 0)
1243+
return ret;
1244+
12381245
if (f->bsize > bsize_max)
12391246
bsize_max = f->bsize;
12401247

0 commit comments

Comments
 (0)