]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: remove object from cache on delete object command
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 29 Apr 2021 16:15:08 +0000 (18:15 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 2 May 2021 21:30:35 +0000 (23:30 +0200)
Update the cache to remove this object from the evaluation phase.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c

index 97a77657bbd66911761d1ec24e8774771392ae38..b5dcdd3542f196eb22207013d013145f169f45e5 100644 (file)
@@ -4433,6 +4433,28 @@ static void ft_del_cache(struct eval_ctx *ctx, struct cmd *cmd)
        flowtable_free(ft);
 }
 
+static void obj_del_cache(struct eval_ctx *ctx, struct cmd *cmd, int type)
+{
+       struct table *table;
+       struct obj *obj;
+
+       if (!cmd->handle.obj.name)
+               return;
+
+       table = table_cache_find(&ctx->nft->cache.table_cache,
+                                cmd->handle.table.name,
+                                cmd->handle.family);
+       if (!table)
+               return;
+
+       obj = obj_cache_find(table, cmd->handle.obj.name, type);
+       if (!obj)
+               return;
+
+       obj_cache_del(obj);
+       obj_free(obj);
+}
+
 static int cmd_evaluate_delete(struct eval_ctx *ctx, struct cmd *cmd)
 {
        switch (cmd->obj) {
@@ -4453,13 +4475,28 @@ static int cmd_evaluate_delete(struct eval_ctx *ctx, struct cmd *cmd)
                ft_del_cache(ctx, cmd);
                return 0;
        case CMD_OBJ_COUNTER:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_COUNTER);
+               return 0;
        case CMD_OBJ_QUOTA:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_QUOTA);
+               return 0;
        case CMD_OBJ_CT_HELPER:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_CT_HELPER);
+               return 0;
        case CMD_OBJ_CT_TIMEOUT:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_CT_TIMEOUT);
+               return 0;
        case CMD_OBJ_LIMIT:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_LIMIT);
+               return 0;
        case CMD_OBJ_SECMARK:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_SECMARK);
+               return 0;
        case CMD_OBJ_CT_EXPECT:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_CT_EXPECT);
+               return 0;
        case CMD_OBJ_SYNPROXY:
+               obj_del_cache(ctx, cmd, NFT_OBJECT_SYNPROXY);
                return 0;
        default:
                BUG("invalid command object type %u\n", cmd->obj);