From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Ahern Subject: Re: [PATCH RFC net-next 4/5] net/ipv4: Update inet_dump_ifaddr to support NLM_F_DUMP_PROPER_HDR Date: Fri, 28 Sep 2018 12:43:04 -0600 Message-ID: <117dd3ae-04c6-b319-c838-e13907b99332@gmail.com> References: <20180928154502.9983-1-dsahern@kernel.org> <20180928154502.9983-5-dsahern@kernel.org> <20180928184115.n7xotgooia6xjfkh@brauner.io> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: netdev@vger.kernel.org, davem@davemloft.net, jbenc@redhat.com, stephen@networkplumber.org To: Christian Brauner , dsahern@kernel.org Return-path: Received: from mail-pg1-f193.google.com ([209.85.215.193]:33437 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726152AbeI2BIL (ORCPT ); Fri, 28 Sep 2018 21:08:11 -0400 Received: by mail-pg1-f193.google.com with SMTP id y18-v6so5093283pge.0 for ; Fri, 28 Sep 2018 11:43:07 -0700 (PDT) In-Reply-To: <20180928184115.n7xotgooia6xjfkh@brauner.io> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: 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]) {