Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[cascardo/linux.git] / net / netfilter / nft_exthdr.c
index 55c939f..ba7aed1 100644 (file)
@@ -26,11 +26,11 @@ struct nft_exthdr {
 };
 
 static void nft_exthdr_eval(const struct nft_expr *expr,
-                           struct nft_data data[NFT_REG_MAX + 1],
+                           struct nft_regs *regs,
                            const struct nft_pktinfo *pkt)
 {
        struct nft_exthdr *priv = nft_expr_priv(expr);
-       struct nft_data *dest = &data[priv->dreg];
+       u32 *dest = &regs->data[priv->dreg];
        unsigned int offset = 0;
        int err;
 
@@ -39,11 +39,12 @@ static void nft_exthdr_eval(const struct nft_expr *expr,
                goto err;
        offset += priv->offset;
 
-       if (skb_copy_bits(pkt->skb, offset, dest->data, priv->len) < 0)
+       dest[priv->len / NFT_REG32_SIZE] = 0;
+       if (skb_copy_bits(pkt->skb, offset, dest, priv->len) < 0)
                goto err;
        return;
 err:
-       data[NFT_REG_VERDICT].verdict = NFT_BREAK;
+       regs->verdict.code = NFT_BREAK;
 }
 
 static const struct nla_policy nft_exthdr_policy[NFTA_EXTHDR_MAX + 1] = {
@@ -58,7 +59,6 @@ static int nft_exthdr_init(const struct nft_ctx *ctx,
                           const struct nlattr * const tb[])
 {
        struct nft_exthdr *priv = nft_expr_priv(expr);
-       int err;
 
        if (tb[NFTA_EXTHDR_DREG] == NULL ||
            tb[NFTA_EXTHDR_TYPE] == NULL ||
@@ -69,22 +69,17 @@ static int nft_exthdr_init(const struct nft_ctx *ctx,
        priv->type   = nla_get_u8(tb[NFTA_EXTHDR_TYPE]);
        priv->offset = ntohl(nla_get_be32(tb[NFTA_EXTHDR_OFFSET]));
        priv->len    = ntohl(nla_get_be32(tb[NFTA_EXTHDR_LEN]));
-       if (priv->len == 0 ||
-           priv->len > FIELD_SIZEOF(struct nft_data, data))
-               return -EINVAL;
+       priv->dreg   = nft_parse_register(tb[NFTA_EXTHDR_DREG]);
 
-       priv->dreg = ntohl(nla_get_be32(tb[NFTA_EXTHDR_DREG]));
-       err = nft_validate_output_register(priv->dreg);
-       if (err < 0)
-               return err;
-       return nft_validate_data_load(ctx, priv->dreg, NULL, NFT_DATA_VALUE);
+       return nft_validate_register_store(ctx, priv->dreg, NULL,
+                                          NFT_DATA_VALUE, priv->len);
 }
 
 static int nft_exthdr_dump(struct sk_buff *skb, const struct nft_expr *expr)
 {
        const struct nft_exthdr *priv = nft_expr_priv(expr);
 
-       if (nla_put_be32(skb, NFTA_EXTHDR_DREG, htonl(priv->dreg)))
+       if (nft_dump_register(skb, NFTA_EXTHDR_DREG, priv->dreg))
                goto nla_put_failure;
        if (nla_put_u8(skb, NFTA_EXTHDR_TYPE, priv->type))
                goto nla_put_failure;