On Mon, 18 Feb 2019 19:21:49 +0100 (CET), Michal Kubecek wrote:
> +             else if (is_u32)
> +                     bitmap_from_arr32(val, bitmap, nbits);
> +             else
> +                     bitmap_copy(val, bitmap, nbits);
> +             nla_for_each_nested(bit_attr, tb[ETHA_BITSET_BITS], rem) {
> +                     *err = ethnl_update_bit(val, mask, nbits, bit_attr,
> +                                             is_list, names, legacy, info);
> +                     if (*err < 0)
> +                             goto out_free;
> +             }
> +             if (bitmask)
> +                     __bitmap_to_any(bitmask, mask, nbits, is_u32);
> +     } else {
> +             unsigned int change_words = DIV_ROUND_UP(change_bits, 32);
> +
> +             *err = 0;
> +             if (change_bits == 0 && tb[ETHA_BITSET_MASK])
> +                     goto out_free;
> +             *err = -EINVAL;
> +             if (!tb[ETHA_BITSET_VALUE])
> +                     goto out_free;

!tb[ETHA_BITSET_BITS] && !tb[ETHA_BITSET_VALUE] is already rejected
above.

> +             if (nla_len(tb[ETHA_BITSET_VALUE]) < change_words * sizeof(u32))
> +                     goto out_free;
> +             if (tb[ETHA_BITSET_MASK] &&
> +                 nla_len(tb[ETHA_BITSET_MASK]) < change_words * sizeof(u32))
> +                     goto out_free;
> +
> +             bitmap_from_arr32(val, nla_data(tb[ETHA_BITSET_VALUE]),
> +                               change_bits);
> +             if (tb[ETHA_BITSET_MASK])
> +                     bitmap_from_arr32(mask, nla_data(tb[ETHA_BITSET_MASK]),
> +                                       change_bits);
> +             else
> +                     bitmap_fill(mask, nbits);
> +
> +             if (nbits < change_bits) {
> +                     unsigned int idx = find_next_bit(mask, max_bits, nbits);
> +
> +                     *err = -EINVAL;
> +                     if (idx < max_bits)
> +                             goto out_free;
> +             }

Reply via email to