Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05b4105e authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso Committed by Greg Kroah-Hartman
Browse files

netfilter: nf_tables: stricter validation of element data



[ 7e6bc1f6cabcd30aba0b11219d8e01b952eacbb6 ]

Make sure element data type and length do not mismatch the one specified
by the set declaration.

Fixes: 7d740264 ("netfilter: nf_tables: variable sized set element keys / data")
Reported-by: default avatarHugues ANGUELKOV <hanguelkov@randorisec.fr>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e832e4ba
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -4315,13 +4315,20 @@ static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set,
				  struct nft_data *data,
				  struct nft_data *data,
				  struct nlattr *attr)
				  struct nlattr *attr)
{
{
	u32 dtype;
	int err;
	int err;


	err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
	err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
	if (err < 0)
	if (err < 0)
		return err;
		return err;


	if (desc->type != NFT_DATA_VERDICT && desc->len != set->dlen) {
	if (set->dtype == NFT_DATA_VERDICT)
		dtype = NFT_DATA_VERDICT;
	else
		dtype = NFT_DATA_VALUE;

	if (dtype != desc->type ||
	    set->dlen != desc->len) {
		nft_data_release(data, desc->type);
		nft_data_release(data, desc->type);
		return -EINVAL;
		return -EINVAL;
	}
	}