On 9/28/18 12:41 PM, Christian Brauner wrote: >> @@ -1683,15 +1683,45 @@ static int inet_dump_ifaddr(struct sk_buff *skb, >> struct netlink_callback *cb) >> s_idx = idx = cb->args[1]; >> s_ip_idx = ip_idx = cb->args[2]; >> >> - if (nlmsg_parse(cb->nlh, sizeof(struct ifaddrmsg), tb, IFA_MAX, >> - ifa_ipv4_policy, NULL) >= 0) { >> - if (tb[IFA_TARGET_NETNSID]) { >> - fillargs.netnsid = nla_get_s32(tb[IFA_TARGET_NETNSID]); >> + if (nlh->nlmsg_flags & NLM_F_DUMP_PROPER_HDR) { >> + struct nlattr *tb[IFA_MAX+1]; >> + struct ifaddrmsg *ifm; >> + int err, i; >> + >> + if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) { >> + NL_SET_ERR_MSG(extack, "Invalid header"); >> + return -EINVAL; >> + } >> + >> + ifm = (struct ifaddrmsg *) nlmsg_data(cb->nlh); >> + if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) { >> + NL_SET_ERR_MSG(extack, "Invalid values in header for >> dump request"); >> + return -EINVAL; >> + } >> + if (ifm->ifa_index) { >> + NL_SET_ERR_MSG(extack, "Filter by device index not >> supported"); >> + return -EINVAL; >> + } >> + err = nlmsg_parse(cb->nlh, sizeof(struct ifaddrmsg), tb, >> IFA_MAX, >> + ifa_ipv4_policy, NULL); >> + if (err < 0) >> + return err; >> >> - tgt_net = rtnl_get_net_ns_capable(skb->sk, >> - fillargs.netnsid); >> - if (IS_ERR(tgt_net)) >> - return PTR_ERR(tgt_net); >> + for (i = 0; i < IFA_MAX; ++i) { >> + if (i == IFA_TARGET_NETNSID) { >> + fillargs.netnsid = nla_get_s32(tb[i]); >> + >> + tgt_net = rtnl_get_net_ns_capable(skb->sk, >> + >> fillargs.netnsid); >> + if (IS_ERR(tgt_net)) >> + return PTR_ERR(tgt_net); >> + >> + fillargs.flags |= NLM_F_DUMP_FILTERED; >> + } >> + if (tb[i]) { >> + NL_SET_ERR_MSG(extack, "Unsupported attribute >> in dump request"); >> + return -EINVAL; >> + } > > That loop doesn't do what it promises, no? Shouldn't it be:
your right, that should be: } else if (tb[i]) {