net: vrf: correct FRA_L3MDEV encode type
Subsystems (4)
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.
--- drivers/net/vrf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
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 ))
Signature · 1 line
2.14.1
Quoted 16 lines · Jeff Barnhill
FRA_L3MDEVis 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")Signed-off-by Jeff Barnhill <[email protected]>--- drivers/net/vrf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/vrf.c +0
-0
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 ))
David Miller
maintainerFrom: Jeff Barnhill <[email protected]>
Date: Wed, 1 Nov 2017 14:58:09 +0000
Quoted 6 lines
FRA_L3MDEVis 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")Signed-off-by Jeff Barnhill <[email protected]>
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.
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
@@ -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)