mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
rtnetlink: Update rtnl_stats_dump for strict data checking
Update rtnl_stats_dump for strict data checking. If the flag is set, the dump request is expected to have an if_stats_msg struct as the header. All elements of the struct are expected to be 0 except filter_mask which must be non-0 (legacy behavior). No attributes are supported. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2d011be8c0
commit
841891ec0c
1 changed files with 22 additions and 2 deletions
|
@ -4680,6 +4680,7 @@ static int rtnl_stats_get(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
|
||||
static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
{
|
||||
struct netlink_ext_ack *extack = cb->extack;
|
||||
int h, s_h, err, s_idx, s_idxattr, s_prividx;
|
||||
struct net *net = sock_net(skb->sk);
|
||||
unsigned int flags = NLM_F_MULTI;
|
||||
|
@ -4696,13 +4697,32 @@ static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
|
||||
cb->seq = net->dev_base_seq;
|
||||
|
||||
if (nlmsg_len(cb->nlh) < sizeof(*ifsm))
|
||||
if (nlmsg_len(cb->nlh) < sizeof(*ifsm)) {
|
||||
NL_SET_ERR_MSG(extack, "Invalid header for stats dump");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ifsm = nlmsg_data(cb->nlh);
|
||||
filter_mask = ifsm->filter_mask;
|
||||
if (!filter_mask)
|
||||
|
||||
/* only requests using NLM_F_DUMP_PROPER_HDR can pass data to
|
||||
* influence the dump. The legacy exception is filter_mask.
|
||||
*/
|
||||
if (cb->strict_check) {
|
||||
if (ifsm->pad1 || ifsm->pad2 || ifsm->ifindex) {
|
||||
NL_SET_ERR_MSG(extack, "Invalid values in header for stats dump request");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (nlmsg_attrlen(cb->nlh, sizeof(*ifsm))) {
|
||||
NL_SET_ERR_MSG(extack, "Invalid attributes after stats header");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
filter_mask = ifsm->filter_mask;
|
||||
if (!filter_mask) {
|
||||
NL_SET_ERR_MSG(extack, "Filter mask must be set for stats dump");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
|
||||
idx = 0;
|
||||
|
|
Loading…
Reference in a new issue