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: c9626a2cbd
("netfilter: nf_tables: add hardware offload support")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
1204c70d9d
commit
de2a605223
|
@ -134,12 +134,13 @@ static int nft_bitwise_offload(struct nft_offload_ctx *ctx,
|
||||||
const struct nft_expr *expr)
|
const struct nft_expr *expr)
|
||||||
{
|
{
|
||||||
const struct nft_bitwise *priv = nft_expr_priv(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)) ||
|
if (memcmp(&priv->xor, &zero, sizeof(priv->xor)) ||
|
||||||
priv->sreg != priv->dreg)
|
priv->sreg != priv->dreg || priv->len != reg->len)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
memcpy(&ctx->regs[priv->dreg].mask, &priv->mask, sizeof(priv->mask));
|
memcpy(®->mask, &priv->mask, sizeof(priv->mask));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ static int __nft_cmp_offload(struct nft_offload_ctx *ctx,
|
||||||
u8 *mask = (u8 *)&flow->match.mask;
|
u8 *mask = (u8 *)&flow->match.mask;
|
||||||
u8 *key = (u8 *)&flow->match.key;
|
u8 *key = (u8 *)&flow->match.key;
|
||||||
|
|
||||||
if (priv->op != NFT_CMP_EQ)
|
if (priv->op != NFT_CMP_EQ || reg->len != priv->len)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
memcpy(key + reg->offset, &priv->data, priv->len);
|
memcpy(key + reg->offset, &priv->data, priv->len);
|
||||||
|
|
Loading…
Reference in New Issue