ethtool: reject unrecognized request flags
As pointed out by Jakub Kicinski, we ethtool netlink code should respond with an error if request head has flags set which are not recognized by kernel, either as a mistake or because it expects functionality introduced in later kernel versions. To avoid unnecessary roundtrips, use extack cookie to provide the information about supported request flags. Signed-off-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
f1388ec4a1
Коммит
2363d73a2f
|
@ -40,6 +40,7 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
|
|||
struct nlattr *tb[ETHTOOL_A_HEADER_MAX + 1];
|
||||
const struct nlattr *devname_attr;
|
||||
struct net_device *dev = NULL;
|
||||
u32 flags = 0;
|
||||
int ret;
|
||||
|
||||
if (!header) {
|
||||
|
@ -50,8 +51,17 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
|
|||
ethnl_header_policy, extack);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
devname_attr = tb[ETHTOOL_A_HEADER_DEV_NAME];
|
||||
if (tb[ETHTOOL_A_HEADER_FLAGS]) {
|
||||
flags = nla_get_u32(tb[ETHTOOL_A_HEADER_FLAGS]);
|
||||
if (flags & ~ETHTOOL_FLAG_ALL) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, tb[ETHTOOL_A_HEADER_FLAGS],
|
||||
"unrecognized request flags");
|
||||
nl_set_extack_cookie_u32(extack, ETHTOOL_FLAG_ALL);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
devname_attr = tb[ETHTOOL_A_HEADER_DEV_NAME];
|
||||
if (tb[ETHTOOL_A_HEADER_DEV_INDEX]) {
|
||||
u32 ifindex = nla_get_u32(tb[ETHTOOL_A_HEADER_DEV_INDEX]);
|
||||
|
||||
|
@ -90,9 +100,7 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
|
|||
}
|
||||
|
||||
req_info->dev = dev;
|
||||
if (tb[ETHTOOL_A_HEADER_FLAGS])
|
||||
req_info->flags = nla_get_u32(tb[ETHTOOL_A_HEADER_FLAGS]);
|
||||
|
||||
req_info->flags = flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче