Commit c630d1fe authored by Sabrina Dubroca's avatar Sabrina Dubroca Committed by David S. Miller

macsec: always read MACSEC_SA_ATTR_PN as a u64

Currently, MACSEC_SA_ATTR_PN is handled inconsistently, sometimes as a
u32, sometimes forced into a u64 without checking the actual length of
the attribute. Instead, we can use nla_get_u64 everywhere, which will
read up to 64 bits into a u64, capped by the actual length of the
attribute coming from userspace.

This fixes several issues:
 - the check in validate_add_rxsa doesn't work with 32-bit attributes
 - the checks in validate_add_txsa and validate_upd_sa incorrectly
   reject X << 32 (with X != 0)

Fixes: 48ef50fa ("macsec: Netlink support of XPN cipher suites (IEEE 802.1AEbw)")
Signed-off-by: default avatarSabrina Dubroca <sd@queasysnail.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b07a0e20
...@@ -1698,7 +1698,7 @@ static bool validate_add_rxsa(struct nlattr **attrs) ...@@ -1698,7 +1698,7 @@ static bool validate_add_rxsa(struct nlattr **attrs)
return false; return false;
if (attrs[MACSEC_SA_ATTR_PN] && if (attrs[MACSEC_SA_ATTR_PN] &&
*(u64 *)nla_data(attrs[MACSEC_SA_ATTR_PN]) == 0) nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
return false; return false;
if (attrs[MACSEC_SA_ATTR_ACTIVE]) { if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
...@@ -1941,7 +1941,7 @@ static bool validate_add_txsa(struct nlattr **attrs) ...@@ -1941,7 +1941,7 @@ static bool validate_add_txsa(struct nlattr **attrs)
if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN) if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN)
return false; return false;
if (nla_get_u32(attrs[MACSEC_SA_ATTR_PN]) == 0) if (nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
return false; return false;
if (attrs[MACSEC_SA_ATTR_ACTIVE]) { if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
...@@ -2295,7 +2295,7 @@ static bool validate_upd_sa(struct nlattr **attrs) ...@@ -2295,7 +2295,7 @@ static bool validate_upd_sa(struct nlattr **attrs)
if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN) if (nla_get_u8(attrs[MACSEC_SA_ATTR_AN]) >= MACSEC_NUM_AN)
return false; return false;
if (attrs[MACSEC_SA_ATTR_PN] && nla_get_u32(attrs[MACSEC_SA_ATTR_PN]) == 0) if (attrs[MACSEC_SA_ATTR_PN] && nla_get_u64(attrs[MACSEC_SA_ATTR_PN]) == 0)
return false; return false;
if (attrs[MACSEC_SA_ATTR_ACTIVE]) { if (attrs[MACSEC_SA_ATTR_ACTIVE]) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment