diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-12-24 12:32:35 -0500 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-12-28 06:14:42 -0500 |
commit | e38195bf32d7ccb2ae3f56f36b895daf455ffd94 (patch) | |
tree | 4baa17d0647af70be1d54fe01840cc9a6abb7dde /net | |
parent | b25adce1606427fd88da08f5203714cada7f6a98 (diff) |
netfilter: nf_tables: fix dumping with large number of sets
If not table name is specified, the dumping of the existing sets
may be incomplete with a sufficiently large number of sets and
tables. This patch fixes missing reset of the cursors after
finding the location of the last object that has been included
in the previous multi-part message.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nf_tables_api.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index f93b7d06f4be..d9fcd279942f 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
@@ -2098,17 +2098,21 @@ static int nf_tables_dump_sets_all(struct nft_ctx *ctx, struct sk_buff *skb, | |||
2098 | struct netlink_callback *cb) | 2098 | struct netlink_callback *cb) |
2099 | { | 2099 | { |
2100 | const struct nft_set *set; | 2100 | const struct nft_set *set; |
2101 | unsigned int idx = 0, s_idx = cb->args[0]; | 2101 | unsigned int idx, s_idx = cb->args[0]; |
2102 | struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2]; | 2102 | struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2]; |
2103 | 2103 | ||
2104 | if (cb->args[1]) | 2104 | if (cb->args[1]) |
2105 | return skb->len; | 2105 | return skb->len; |
2106 | 2106 | ||
2107 | list_for_each_entry(table, &ctx->afi->tables, list) { | 2107 | list_for_each_entry(table, &ctx->afi->tables, list) { |
2108 | if (cur_table && cur_table != table) | 2108 | if (cur_table) { |
2109 | continue; | 2109 | if (cur_table != table) |
2110 | continue; | ||
2110 | 2111 | ||
2112 | cur_table = NULL; | ||
2113 | } | ||
2111 | ctx->table = table; | 2114 | ctx->table = table; |
2115 | idx = 0; | ||
2112 | list_for_each_entry(set, &ctx->table->sets, list) { | 2116 | list_for_each_entry(set, &ctx->table->sets, list) { |
2113 | if (idx < s_idx) | 2117 | if (idx < s_idx) |
2114 | goto cont; | 2118 | goto cont; |