]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ethtool: Validate module EEPROM offset as part of policy
authorIdo Schimmel <idosch@nvidia.com>
Tue, 22 Jun 2021 06:50:52 +0000 (09:50 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Jun 2021 17:40:54 +0000 (10:40 -0700)
Validate the offset to read from module EEPROM as part of the netlink
policy and remove the corresponding check from the code.

This also makes it possible to query the offset range from user space:

 $ genl ctrl policy name ethtool
 ...
 ID: 0x14  policy[32]:attr[2]: type=U32 range:[0,255]
 ...

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ethtool/eeprom.c

index 1e75d9c1b1543e8022913ded291c8229d4fb33c3..7e6b37a54add3573150a0b4d90f2e16092a873cd 100644 (file)
@@ -177,10 +177,6 @@ static int eeprom_parse_request(struct ethnl_req_info *req_info, struct nlattr *
                NL_SET_ERR_MSG_ATTR(extack, tb[ETHTOOL_A_MODULE_EEPROM_LENGTH],
                                    "reading cross half page boundary is illegal");
                return -EINVAL;
-       } else if (request->offset >= ETH_MODULE_EEPROM_PAGE_LEN * 2) {
-               NL_SET_ERR_MSG_ATTR(extack, tb[ETHTOOL_A_MODULE_EEPROM_OFFSET],
-                                   "offset is out of bounds");
-               return -EINVAL;
        } else if (request->offset + request->length > ETH_MODULE_EEPROM_PAGE_LEN * 2) {
                NL_SET_ERR_MSG_ATTR(extack, tb[ETHTOOL_A_MODULE_EEPROM_LENGTH],
                                    "reading cross page boundary is illegal");
@@ -233,7 +229,8 @@ const struct ethnl_request_ops ethnl_module_eeprom_request_ops = {
 
 const struct nla_policy ethnl_module_eeprom_get_policy[] = {
        [ETHTOOL_A_MODULE_EEPROM_HEADER]        = NLA_POLICY_NESTED(ethnl_header_policy),
-       [ETHTOOL_A_MODULE_EEPROM_OFFSET]        = { .type = NLA_U32 },
+       [ETHTOOL_A_MODULE_EEPROM_OFFSET]        =
+               NLA_POLICY_MAX(NLA_U32, ETH_MODULE_EEPROM_PAGE_LEN * 2 - 1),
        [ETHTOOL_A_MODULE_EEPROM_LENGTH]        =
                NLA_POLICY_RANGE(NLA_U32, 1, ETH_MODULE_EEPROM_PAGE_LEN),
        [ETHTOOL_A_MODULE_EEPROM_PAGE]          = { .type = NLA_U8 },