Commit de2a6052 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso
Browse files

netfilter: nf_tables_offload: check for register data length mismatches



Make sure register data length does not mismatch immediate data length,
otherwise hit EOPNOTSUPP.

Fixes: c9626a2c ("netfilter: nf_tables: add hardware offload support")
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 1204c70d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -134,12 +134,13 @@ static int nft_bitwise_offload(struct nft_offload_ctx *ctx,
                               const struct nft_expr *expr)
{
	const struct nft_bitwise *priv = nft_expr_priv(expr);
	struct nft_offload_reg *reg = &ctx->regs[priv->dreg];

	if (memcmp(&priv->xor, &zero, sizeof(priv->xor)) ||
	    priv->sreg != priv->dreg)
	    priv->sreg != priv->dreg || priv->len != reg->len)
		return -EOPNOTSUPP;

	memcpy(&ctx->regs[priv->dreg].mask, &priv->mask, sizeof(priv->mask));
	memcpy(&reg->mask, &priv->mask, sizeof(priv->mask));

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ static int __nft_cmp_offload(struct nft_offload_ctx *ctx,
	u8 *mask = (u8 *)&flow->match.mask;
	u8 *key = (u8 *)&flow->match.key;

	if (priv->op != NFT_CMP_EQ)
	if (priv->op != NFT_CMP_EQ || reg->len != priv->len)
		return -EOPNOTSUPP;

	memcpy(key + reg->offset, &priv->data, priv->len);