Commit 2363d73a authored by Michal Kubecek's avatar Michal Kubecek Committed by David S. Miller

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: default avatarMichal Kubecek <mkubecek@suse.cz>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f1388ec4
...@@ -40,6 +40,7 @@ int ethnl_parse_header(struct ethnl_req_info *req_info, ...@@ -40,6 +40,7 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
struct nlattr *tb[ETHTOOL_A_HEADER_MAX + 1]; struct nlattr *tb[ETHTOOL_A_HEADER_MAX + 1];
const struct nlattr *devname_attr; const struct nlattr *devname_attr;
struct net_device *dev = NULL; struct net_device *dev = NULL;
u32 flags = 0;
int ret; int ret;
if (!header) { if (!header) {
...@@ -50,8 +51,17 @@ int ethnl_parse_header(struct ethnl_req_info *req_info, ...@@ -50,8 +51,17 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
ethnl_header_policy, extack); ethnl_header_policy, extack);
if (ret < 0) if (ret < 0)
return ret; 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]) { if (tb[ETHTOOL_A_HEADER_DEV_INDEX]) {
u32 ifindex = nla_get_u32(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, ...@@ -90,9 +100,7 @@ int ethnl_parse_header(struct ethnl_req_info *req_info,
} }
req_info->dev = dev; req_info->dev = dev;
if (tb[ETHTOOL_A_HEADER_FLAGS]) req_info->flags = flags;
req_info->flags = nla_get_u32(tb[ETHTOOL_A_HEADER_FLAGS]);
return 0; return 0;
} }
......
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