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

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

netfilter: nftables: add nft_parse_register_store() and use it



[ 345023b0db315648ccc3c1a36aee88304a8b4d91 ]

This new function combines the netlink register attribute parser
and the store validation function.

This update requires to replace:

        enum nft_registers      dreg:8;

in many of the expression private areas otherwise compiler complains
with:

        error: cannot take address of bit-field ‘dreg’

when passing the register field as reference.

Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 25336cd9
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -209,8 +209,8 @@ unsigned int nft_parse_register(const struct nlattr *attr);
int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg);

int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len);
int nft_validate_register_store(const struct nft_ctx *ctx,
				enum nft_registers reg,
int nft_parse_register_store(const struct nft_ctx *ctx,
			     const struct nlattr *attr, u8 *dreg,
			     const struct nft_data *data,
			     enum nft_data_types type, unsigned int len);

+2 −2
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ struct nft_cmp_fast_expr {

struct nft_immediate_expr {
	struct nft_data		data;
	enum nft_registers	dreg:8;
	u8			dreg;
	u8			dlen;
};

@@ -51,7 +51,7 @@ struct nft_payload {
	enum nft_payload_bases	base:8;
	u8			offset;
	u8			len;
	enum nft_registers	dreg:8;
	u8			dreg;
};

struct nft_payload_set {
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
#include <net/netfilter/nf_tables.h>

struct nft_fib {
	enum nft_registers	dreg:8;
	u8			dreg;
	u8			result;
	u32			flags;
};
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
struct nft_meta {
	enum nft_meta_keys	key:8;
	union {
		enum nft_registers	dreg:8;
		u8		dreg;
		u8		sreg;
	};
};
+2 −3
Original line number Diff line number Diff line
@@ -87,9 +87,8 @@ static int nft_meta_bridge_get_init(const struct nft_ctx *ctx,
		return nft_meta_get_init(ctx, expr, tb);
	}

	priv->dreg = nft_parse_register(tb[NFTA_META_DREG]);
	return nft_validate_register_store(ctx, priv->dreg, NULL,
					   NFT_DATA_VALUE, len);
	return nft_parse_register_store(ctx, tb[NFTA_META_DREG], &priv->dreg,
					NULL, NFT_DATA_VALUE, len);
}

static struct nft_expr_type nft_meta_bridge_type;
Loading