|
@@ -2946,24 +2946,20 @@ int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
|
|
* jumps are already validated for that chain.
|
|
|
*/
|
|
|
list_for_each_entry(i, &set->bindings, list) {
|
|
|
- if (binding->flags & NFT_SET_MAP &&
|
|
|
+ if (i->flags & NFT_SET_MAP &&
|
|
|
i->chain == binding->chain)
|
|
|
goto bind;
|
|
|
}
|
|
|
|
|
|
+ iter.genmask = nft_genmask_next(ctx->net);
|
|
|
iter.skip = 0;
|
|
|
iter.count = 0;
|
|
|
iter.err = 0;
|
|
|
iter.fn = nf_tables_bind_check_setelem;
|
|
|
|
|
|
set->ops->walk(ctx, set, &iter);
|
|
|
- if (iter.err < 0) {
|
|
|
- /* Destroy anonymous sets if binding fails */
|
|
|
- if (set->flags & NFT_SET_ANONYMOUS)
|
|
|
- nf_tables_set_destroy(ctx, set);
|
|
|
-
|
|
|
+ if (iter.err < 0)
|
|
|
return iter.err;
|
|
|
- }
|
|
|
}
|
|
|
bind:
|
|
|
binding->chain = ctx->chain;
|
|
@@ -3192,12 +3188,13 @@ static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
if (nest == NULL)
|
|
|
goto nla_put_failure;
|
|
|
|
|
|
- args.cb = cb;
|
|
|
- args.skb = skb;
|
|
|
- args.iter.skip = cb->args[0];
|
|
|
- args.iter.count = 0;
|
|
|
- args.iter.err = 0;
|
|
|
- args.iter.fn = nf_tables_dump_setelem;
|
|
|
+ args.cb = cb;
|
|
|
+ args.skb = skb;
|
|
|
+ args.iter.genmask = nft_genmask_cur(ctx.net);
|
|
|
+ args.iter.skip = cb->args[0];
|
|
|
+ args.iter.count = 0;
|
|
|
+ args.iter.err = 0;
|
|
|
+ args.iter.fn = nf_tables_dump_setelem;
|
|
|
set->ops->walk(&ctx, set, &args.iter);
|
|
|
|
|
|
nla_nest_end(skb, nest);
|
|
@@ -4284,6 +4281,7 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx,
|
|
|
binding->chain != chain)
|
|
|
continue;
|
|
|
|
|
|
+ iter.genmask = nft_genmask_next(ctx->net);
|
|
|
iter.skip = 0;
|
|
|
iter.count = 0;
|
|
|
iter.err = 0;
|