diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2019-12-05 19:07:16 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2019-12-09 13:56:11 +0100 |
commit | fbae632804554aa39abb8f76fbca5935cdd7e620 (patch) | |
tree | c161a16410b51ea04c49ceee1562f71a0091f4b7 /include | |
parent | 940b93a5c63d16ee21b5879f530876941ba04759 (diff) |
segtree: don't remove nul-root element from interval set
Check from the delinearize set element path if the nul-root element
already exists in the interval set. Hence, the element insertion path
skips the implicit nul-root interval insertion.
Under some circunstances, nft bogusly fails to delete the last element
of the interval set and to create an element in an existing empty
internal set. This patch includes a test that reproduces the issue.
Fixes: 4935a0d561b5 ("segtree: special handling for the first non-matching segment")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/netlink.h | 2 | ||||
-rw-r--r-- | include/rule.h | 1 |
2 files changed, 2 insertions, 1 deletions
diff --git a/include/netlink.h b/include/netlink.h index e6941714..53a55b61 100644 --- a/include/netlink.h +++ b/include/netlink.h @@ -133,7 +133,7 @@ extern int netlink_get_setelem(struct netlink_ctx *ctx, const struct handle *h, const struct location *loc, struct table *table, struct set *set, struct expr *init); extern int netlink_delinearize_setelem(struct nftnl_set_elem *nlse, - const struct set *set, + struct set *set, struct nft_cache *cache); extern int netlink_list_objs(struct netlink_ctx *ctx, const struct handle *h); diff --git a/include/rule.h b/include/rule.h index 0b2eba37..dadeb4b9 100644 --- a/include/rule.h +++ b/include/rule.h @@ -307,6 +307,7 @@ struct set { struct expr *init; struct expr *rg_cache; uint32_t policy; + bool root; bool automerge; struct { uint32_t size; |