aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2013-12-24 12:32:35 -0500
committerPablo Neira Ayuso <pablo@netfilter.org>2013-12-28 06:14:42 -0500
commite38195bf32d7ccb2ae3f56f36b895daf455ffd94 (patch)
tree4baa17d0647af70be1d54fe01840cc9a6abb7dde /net
parentb25adce1606427fd88da08f5203714cada7f6a98 (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.c10
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;