On Tue, Jun 25, 2019 at 12:37:11PM +0200, Fernando Fernandez Mancera wrote:
[...]
> +static int nft_synproxy_init(const struct nft_ctx *ctx,
> +                          const struct nft_expr *expr,
> +                          const struct nlattr * const tb[])
> +{
> +     struct synproxy_net *snet = synproxy_pernet(ctx->net);
> +     struct nft_synproxy *priv = nft_expr_priv(expr);
> +     u32 flags;
> +     int err;
> +
> +     if (tb[NFTA_SYNPROXY_MSS])
> +             priv->info.mss = ntohs(nla_get_be16(tb[NFTA_SYNPROXY_MSS]));
> +     if (tb[NFTA_SYNPROXY_WSCALE])
> +             priv->info.wscale = nla_get_u8(tb[NFTA_SYNPROXY_WSCALE]);
> +     if (tb[NFTA_SYNPROXY_FLAGS]) {
> +             flags = ntohl(nla_get_be32(tb[NFTA_SYNPROXY_FLAGS]));
> +             if (flags != 0 && (flags & NF_SYNPROXY_OPT_MASK) == 0)

Question: Is flag == 0 valid? If so, no need to return EINVAL in this
case.

> +                     return -EINVAL;
> +             priv->info.options = flags;
> +     }
> +
> +     err = nf_ct_netns_get(ctx->net, ctx->family);
> +     if (err)
> +             return err;
> +
> +     switch (ctx->family) {
> +     case NFPROTO_IPV4:
> +             err = nf_synproxy_ipv4_init(snet, ctx->net);
> +             if (err)
> +                     goto nf_ct_failure;
> +             snet->hook_ref4++;

nf_synproxy_ipv4_init() internally deals with bumping hook_ref4,
right?

> +             break;
> +#if IS_ENABLED(CONFIG_IPV6)
> +     case NFPROTO_IPV6:
> +             err = nf_synproxy_ipv6_init(snet, ctx->net);
> +             if (err)
> +                     goto nf_ct_failure;
> +             snet->hook_ref6++;

Same here.

> +             break;

#endif /* CONFIG_IPV6 */

Note that #endif should finish here, NFPROTO_INET and NFPROTO_BRIDGE
should not be wrapper by this.

finishes here. You can probably replace this to CONFIG_NF_TABLES_IPV6
as above, right?

> +     case NFPROTO_INET:
> +     case NFPROTO_BRIDGE:
> +             err = nf_synproxy_ipv4_init(snet, ctx->net);
> +             if (err)
> +                     goto nf_ct_failure;

Missing ifdef.

> +             err = nf_synproxy_ipv6_init(snet, ctx->net);
> +             if (err)
> +                     goto nf_ct_failure;
> +             snet->hook_ref4++;
> +             snet->hook_ref6++;

Bumping refcnt manually?

> +             break;
> +#endif
> +     }
> +
> +     return 0;
> +
> +nf_ct_failure:
> +     nf_ct_netns_put(ctx->net, ctx->family);
> +     return err;
> +}
> +
> +static void nft_synproxy_destroy(const struct nft_ctx *ctx,
> +                              const struct nft_expr *expr)
> +{
> +     struct synproxy_net *snet = synproxy_pernet(ctx->net);
> +
> +     switch (ctx->family) {
> +     case NFPROTO_IPV4:
> +             nf_synproxy_ipv4_fini(snet, ctx->net);
> +             break;
> +#if IS_ENABLED(CONFIG_IPV6)
> +     case NFPROTO_IPV6:
> +             nf_synproxy_ipv6_fini(snet, ctx->net);
> +             break;
> +     case NFPROTO_INET:
> +     case NFPROTO_BRIDGE:
> +             nf_synproxy_ipv4_fini(snet, ctx->net);

We should allow bridge to run only with IPv4, if CONFIG_IPV6 is unset.

Just wrap this:

#ifdef IS_ENABLED(...)

> +             nf_synproxy_ipv6_fini(snet, ctx->net);

#endif

Or there's another trick you can do, in the header file, you add:

#ifdef IS_ENABLED(...)
void nf_synproxy_ipv6_fini(..., ...);
#else
static inline void nf_synproxy_ipv6_fini(..., ...) {}
#endid

so we don't need this #ifdef in the code.

Reply via email to