Skip to content

Commit 6e1acfa

Browse files
committed
netfilter: nf_tables: validate registers coming from userspace.
Bail out in case userspace uses unsupported registers. Fixes: 49499c3 ("netfilter: nf_tables: switch registers to 32 bit addressing") Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent 0492d85 commit 6e1acfa

1 file changed

Lines changed: 17 additions & 5 deletions

File tree

net/netfilter/nf_tables_api.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9275,17 +9275,23 @@ int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
92759275
}
92769276
EXPORT_SYMBOL_GPL(nft_parse_u32_check);
92779277

9278-
static unsigned int nft_parse_register(const struct nlattr *attr)
9278+
static unsigned int nft_parse_register(const struct nlattr *attr, u32 *preg)
92799279
{
92809280
unsigned int reg;
92819281

92829282
reg = ntohl(nla_get_be32(attr));
92839283
switch (reg) {
92849284
case NFT_REG_VERDICT...NFT_REG_4:
9285-
return reg * NFT_REG_SIZE / NFT_REG32_SIZE;
9285+
*preg = reg * NFT_REG_SIZE / NFT_REG32_SIZE;
9286+
break;
9287+
case NFT_REG32_00...NFT_REG32_15:
9288+
*preg = reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
9289+
break;
92869290
default:
9287-
return reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
9291+
return -ERANGE;
92889292
}
9293+
9294+
return 0;
92899295
}
92909296

92919297
/**
@@ -9327,7 +9333,10 @@ int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len)
93279333
u32 reg;
93289334
int err;
93299335

9330-
reg = nft_parse_register(attr);
9336+
err = nft_parse_register(attr, &reg);
9337+
if (err < 0)
9338+
return err;
9339+
93319340
err = nft_validate_register_load(reg, len);
93329341
if (err < 0)
93339342
return err;
@@ -9382,7 +9391,10 @@ int nft_parse_register_store(const struct nft_ctx *ctx,
93829391
int err;
93839392
u32 reg;
93849393

9385-
reg = nft_parse_register(attr);
9394+
err = nft_parse_register(attr, &reg);
9395+
if (err < 0)
9396+
return err;
9397+
93869398
err = nft_validate_register_store(ctx, reg, data, type, len);
93879399
if (err < 0)
93889400
return err;

0 commit comments

Comments
 (0)