netfilter: nft_ct: prepare for key-dependent error unwind
authorFlorian Westphal <fw@strlen.de>
Fri, 3 Feb 2017 12:35:49 +0000 (13:35 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 8 Feb 2017 13:16:23 +0000 (14:16 +0100)
Next patch will add ZONE_ID set support which will need similar
error unwind (put operation) as conntrack labels.

Prepare for this: remove the 'label_got' boolean in favor
of a switch statement that can be extended in next patch.

As we already have that in the set_destroy function place that in
a separate function and call it from the set init function.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_ct.c

index 5bd4cdf..2d82df2 100644 (file)
@@ -386,12 +386,24 @@ static int nft_ct_get_init(const struct nft_ctx *ctx,
        return 0;
 }
 
+static void __nft_ct_set_destroy(const struct nft_ctx *ctx, struct nft_ct *priv)
+{
+       switch (priv->key) {
+#ifdef CONFIG_NF_CONNTRACK_LABELS
+       case NFT_CT_LABELS:
+               nf_connlabels_put(ctx->net);
+               break;
+#endif
+       default:
+               break;
+       }
+}
+
 static int nft_ct_set_init(const struct nft_ctx *ctx,
                           const struct nft_expr *expr,
                           const struct nlattr * const tb[])
 {
        struct nft_ct *priv = nft_expr_priv(expr);
-       bool label_got = false;
        unsigned int len;
        int err;
 
@@ -412,7 +424,6 @@ static int nft_ct_set_init(const struct nft_ctx *ctx,
                err = nf_connlabels_get(ctx->net, (len * BITS_PER_BYTE) - 1);
                if (err)
                        return err;
-               label_got = true;
                break;
 #endif
        default:
@@ -431,8 +442,7 @@ static int nft_ct_set_init(const struct nft_ctx *ctx,
        return 0;
 
 err1:
-       if (label_got)
-               nf_connlabels_put(ctx->net);
+       __nft_ct_set_destroy(ctx, priv);
        return err;
 }
 
@@ -447,16 +457,7 @@ static void nft_ct_set_destroy(const struct nft_ctx *ctx,
 {
        struct nft_ct *priv = nft_expr_priv(expr);
 
-       switch (priv->key) {
-#ifdef CONFIG_NF_CONNTRACK_LABELS
-       case NFT_CT_LABELS:
-               nf_connlabels_put(ctx->net);
-               break;
-#endif
-       default:
-               break;
-       }
-
+       __nft_ct_set_destroy(ctx, priv);
        nft_ct_netns_put(ctx->net, ctx->afi->family);
 }