summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/evaluate.c15
-rw-r--r--src/rule.c15
2 files changed, 15 insertions, 15 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index d18b8f63..8b54dbc0 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -1885,6 +1885,19 @@ static int table_evaluate(struct eval_ctx *ctx, struct table *table)
struct chain *chain;
struct set *set;
+ if (table_lookup(&ctx->cmd->handle) == NULL) {
+ if (table == NULL) {
+ table = table_alloc();
+ handle_merge(&table->handle, &ctx->cmd->handle);
+ table_add_hash(table);
+ } else {
+ table_add_hash(table_get(table));
+ }
+ }
+
+ if (ctx->cmd->table == NULL)
+ return 0;
+
ctx->table = table;
list_for_each_entry(set, &table->sets, list) {
handle_merge(&set->handle, &table->handle);
@@ -1916,8 +1929,6 @@ static int cmd_evaluate_add(struct eval_ctx *ctx, struct cmd *cmd)
return 0;
return chain_evaluate(ctx, cmd->chain);
case CMD_OBJ_TABLE:
- if (cmd->data == NULL)
- return 0;
return table_evaluate(ctx, cmd->table);
default:
BUG("invalid command object type %u\n", cmd->obj);
diff --git a/src/rule.c b/src/rule.c
index 7701e211..ccfde3de 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -1003,15 +1003,8 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
struct table *table = NULL;
struct set *set;
- /* No need to allocate the table object when listing all tables */
- if (cmd->handle.table != NULL) {
+ if (cmd->handle.table != NULL)
table = table_lookup(&cmd->handle);
- if (table == NULL) {
- table = table_alloc();
- handle_merge(&table->handle, &cmd->handle);
- table_add_hash(table);
- }
- }
switch (cmd->obj) {
case CMD_OBJ_TABLE:
@@ -1072,14 +1065,10 @@ static int do_command_flush(struct netlink_ctx *ctx, struct cmd *cmd)
static int do_command_rename(struct netlink_ctx *ctx, struct cmd *cmd)
{
- struct table *table;
+ struct table *table = table_lookup(&cmd->handle);
struct chain *chain;
int err;
- table = table_alloc();
- handle_merge(&table->handle, &cmd->handle);
- table_add_hash(table);
-
switch (cmd->obj) {
case CMD_OBJ_CHAIN:
err = netlink_get_chain(ctx, &cmd->handle, &cmd->location);