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]) {

Reply via email to