Skip to contentSkip to conversation

net: vrf: correct FRA_L3MDEV encode type

PATCH In review Jeff Barnhill 3 participants 4 messages Nov 1, 2017 – Nov 2, 2017

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 net: vrf: correct FRA_L3MDEV encode type

FRA_L3MDEV is defined as U8, but is being added as a U32 attribute. On big endian architecture, this results in the l3mdev entry not being added to the FIB rules.

Fixes 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create")
---
 drivers/net/vrf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/vrf.c +1 -1
index 9b243e6f3008..7dc3bcac3506 100644
@@ -1165,7 +1165,7 @@ static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it)
 	frh->family = family;
 	frh->action = FR_ACT_TO_TBL;
 
-	if (nla_put_u32(skb, FRA_L3MDEV, 1))
+	if (nla_put_u8(skb, FRA_L3MDEV, 1))
 		goto nla_put_failure;
 
 	if (nla_put_u32(skb, FRA_PRIORITY, FIB_RULE_PREF))
Signature · 1 line
2.14.1
Acked-by on v1 1/1
#1 lore raw
Quoted 16 lines · Jeff Barnhill

FRA_L3MDEV is defined as U8, but is being added as a U32 attribute. On big endian architecture, this results in the l3mdev entry not being added to the FIB rules.

Fixes 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create")
---
 drivers/net/vrf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/vrf.c +0 -0
index 9b243e6f3008..7dc3bcac3506 100644

drivers/net/vrf.c static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it) · line 1171

Quoted 8 lines
drivers/net/vrf.c +1 -1
@@ -1165,7 +1165,7 @@ static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it)
 	frh->family = family;
 	frh->action = FR_ACT_TO_TBL;
 
-	if (nla_put_u32(skb, FRA_L3MDEV, 1))
+	if (nla_put_u8(skb, FRA_L3MDEV, 1))
 		goto nla_put_failure;
 
 	if (nla_put_u32(skb, FRA_PRIORITY, FIB_RULE_PREF))
maintainer
#2 lore raw
In reply to Jeff Barnhill

From: Jeff Barnhill <[email protected]>
Date: Wed, 1 Nov 2017 14:58:09 +0000

Quoted 6 lines

FRA_L3MDEV is defined as U8, but is being added as a U32 attribute. On big endian architecture, this results in the l3mdev entry not being added to the FIB rules.

Fixes 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create")

Applied and queued up for -stable, thank you.

I wish we could trap things like this using the policy, enforcing an exact size access for attributes such as these.

Thanks again.

#3 lore raw
Quoted 3 lines · David Miller

I wish we could trap things like this using the policy, enforcing an exact size access for attributes such as these.

From feae5aa9dd7a26b7fbf33582738c7c89f068d81b Mon Sep 17 00:00:00 2001
From: David Ahern <[email protected]>
Date: Thu, 2 Nov 2017 12:18:02 -0700
Subject: [PATCH net-next] net: netlink: Update attr validation to require
exact length for some types

Attributes using NLA_U* and NLA_S* (where * is 8, 16,32 and 64) are expected to be an exact length. Spliti these data types from nla_attr_minlen into nla_attr_len and update validate_nla to require the attribute to have exact length for them.

---
 lib/nlattr.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
lib/nlattr.c +14 -3
index 927c2f19f119..b5e360e7dfc8 100644
@@ -14,19 +14,23 @@
 #include <linux/types.h>
 #include <net/netlink.h>
 
-static const u8 nla_attr_minlen[NLA_TYPE_MAX+1] = {
+/* for these data types attribute length must be exactly given size */
+static const u8 nla_attr_len[NLA_TYPE_MAX+1] = {
 	[NLA_U8]	= sizeof(u8),
 	[NLA_U16]	= sizeof(u16),
 	[NLA_U32]	= sizeof(u32),
 	[NLA_U64]	= sizeof(u64),
-	[NLA_MSECS]	= sizeof(u64),
-	[NLA_NESTED]	= NLA_HDRLEN,
 	[NLA_S8]	= sizeof(s8),
 	[NLA_S16]	= sizeof(s16),
 	[NLA_S32]	= sizeof(s32),
 	[NLA_S64]	= sizeof(s64),
 };
 
+static const u8 nla_attr_minlen[NLA_TYPE_MAX+1] = {
+	[NLA_MSECS]	= sizeof(u64),
+	[NLA_NESTED]	= NLA_HDRLEN,
+};
+
 static int validate_nla_bitfield32(const struct nlattr *nla,
 				   u32 *valid_flags_allowed)
 {
@@ -64,6 +68,13 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
 
 	BUG_ON(pt->type > NLA_TYPE_MAX);
 
+	/* for data types NLA_U* and NLA_S* require exact length */
+	if (nla_attr_len[pt->type]) {
+		if (attrlen != nla_attr_len[pt->type])
+			return -ERANGE;
+		return 0;
+	}
+
 	switch (pt->type) {
 	case NLA_FLAG:
 		if (attrlen > 0)
Signature · 1 line
2.13.5 (Apple Git-94)