Skip to content

Commit 0eb4b5e

Browse files
sbrivio-rhummakynes
authored andcommitted
netfilter: nft_set_pipapo: Separate partial and complete overlap cases on insertion
...and return -ENOTEMPTY to the front-end on collision, -EEXIST if an identical element already exists. Together with the previous patch, element collision will now be returned to the user as -EEXIST. Reported-by: Phil Sutter <[email protected]> Signed-off-by: Stefano Brivio <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 8c2d45b commit 0eb4b5e

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

net/netfilter/nft_set_pipapo.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,21 +1098,41 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
10981098
struct nft_pipapo_field *f;
10991099
int i, bsize_max, err = 0;
11001100

1101+
if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END))
1102+
end = (const u8 *)nft_set_ext_key_end(ext)->data;
1103+
else
1104+
end = start;
1105+
11011106
dup = pipapo_get(net, set, start, genmask);
1102-
if (PTR_ERR(dup) == -ENOENT) {
1103-
if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END)) {
1104-
end = (const u8 *)nft_set_ext_key_end(ext)->data;
1105-
dup = pipapo_get(net, set, end, nft_genmask_next(net));
1106-
} else {
1107-
end = start;
1107+
if (!IS_ERR(dup)) {
1108+
/* Check if we already have the same exact entry */
1109+
const struct nft_data *dup_key, *dup_end;
1110+
1111+
dup_key = nft_set_ext_key(&dup->ext);
1112+
if (nft_set_ext_exists(&dup->ext, NFT_SET_EXT_KEY_END))
1113+
dup_end = nft_set_ext_key_end(&dup->ext);
1114+
else
1115+
dup_end = dup_key;
1116+
1117+
if (!memcmp(start, dup_key->data, sizeof(*dup_key->data)) &&
1118+
!memcmp(end, dup_end->data, sizeof(*dup_end->data))) {
1119+
*ext2 = &dup->ext;
1120+
return -EEXIST;
11081121
}
1122+
1123+
return -ENOTEMPTY;
1124+
}
1125+
1126+
if (PTR_ERR(dup) == -ENOENT) {
1127+
/* Look for partially overlapping entries */
1128+
dup = pipapo_get(net, set, end, nft_genmask_next(net));
11091129
}
11101130

11111131
if (PTR_ERR(dup) != -ENOENT) {
11121132
if (IS_ERR(dup))
11131133
return PTR_ERR(dup);
11141134
*ext2 = &dup->ext;
1115-
return -EEXIST;
1135+
return -ENOTEMPTY;
11161136
}
11171137

11181138
/* Validate */

0 commit comments

Comments
 (0)