Lines Matching +full:min +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0
56 static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
68 return -EINVAL; in validate_nla_bitfield32()
71 if (bf->selector & ~valid_flags_mask) in validate_nla_bitfield32()
72 return -EINVAL; in validate_nla_bitfield32()
75 if (bf->value & ~valid_flags_mask) in validate_nla_bitfield32()
76 return -EINVAL; in validate_nla_bitfield32()
79 if (bf->value & ~bf->selector) in validate_nla_bitfield32()
80 return -EINVAL; in validate_nla_bitfield32()
85 static int nla_validate_array(const struct nlattr *head, int len, int maxtype, in nla_validate_array() argument
93 nla_for_each_attr(entry, head, len, rem) { in nla_validate_array()
102 return -ERANGE; in nla_validate_array()
118 WARN_ON_ONCE(pt->validation_type != NLA_VALIDATE_RANGE_PTR && in nla_get_range_unsigned()
119 (pt->min < 0 || pt->max < 0)); in nla_get_range_unsigned()
121 range->min = 0; in nla_get_range_unsigned()
123 switch (pt->type) { in nla_get_range_unsigned()
125 range->max = U8_MAX; in nla_get_range_unsigned()
130 range->max = U16_MAX; in nla_get_range_unsigned()
134 range->max = U32_MAX; in nla_get_range_unsigned()
138 range->max = U64_MAX; in nla_get_range_unsigned()
145 switch (pt->validation_type) { in nla_get_range_unsigned()
148 range->min = pt->min; in nla_get_range_unsigned()
149 range->max = pt->max; in nla_get_range_unsigned()
152 *range = *pt->range; in nla_get_range_unsigned()
155 range->min = pt->min; in nla_get_range_unsigned()
158 range->max = pt->max; in nla_get_range_unsigned()
173 switch (pt->type) { in nla_validate_range_unsigned()
199 return -EINVAL; in nla_validate_range_unsigned()
204 if (pt->validation_type == NLA_VALIDATE_RANGE_WARN_TOO_LONG && in nla_validate_range_unsigned()
205 pt->type == NLA_BINARY && value > range.max) { in nla_validate_range_unsigned()
207 current->comm, pt->type); in nla_validate_range_unsigned()
211 return -EINVAL; in nla_validate_range_unsigned()
214 /* this assumes min <= max (don't validate against min) */ in nla_validate_range_unsigned()
218 if (value < range.min || value > range.max) { in nla_validate_range_unsigned()
219 bool binary = pt->type == NLA_BINARY; in nla_validate_range_unsigned()
228 return -ERANGE; in nla_validate_range_unsigned()
237 switch (pt->type) { in nla_get_range_signed()
239 range->min = S8_MIN; in nla_get_range_signed()
240 range->max = S8_MAX; in nla_get_range_signed()
243 range->min = S16_MIN; in nla_get_range_signed()
244 range->max = S16_MAX; in nla_get_range_signed()
247 range->min = S32_MIN; in nla_get_range_signed()
248 range->max = S32_MAX; in nla_get_range_signed()
251 range->min = S64_MIN; in nla_get_range_signed()
252 range->max = S64_MAX; in nla_get_range_signed()
259 switch (pt->validation_type) { in nla_get_range_signed()
261 range->min = pt->min; in nla_get_range_signed()
262 range->max = pt->max; in nla_get_range_signed()
265 *range = *pt->range_signed; in nla_get_range_signed()
268 range->min = pt->min; in nla_get_range_signed()
271 range->max = pt->max; in nla_get_range_signed()
285 switch (pt->type) { in nla_validate_int_range_signed()
299 return -EINVAL; in nla_validate_int_range_signed()
304 if (value < range.min || value > range.max) { in nla_validate_int_range_signed()
307 return -ERANGE; in nla_validate_int_range_signed()
318 switch (pt->type) { in nla_validate_int_range()
335 return -EINVAL; in nla_validate_int_range()
345 switch (pt->type) { in nla_validate_mask()
365 return -EINVAL; in nla_validate_mask()
368 if (value & ~(u64)pt->mask) { in nla_validate_mask()
370 return -EINVAL; in nla_validate_mask()
383 int err = -ERANGE; in validate_nla()
394 BUG_ON(pt->type > NLA_TYPE_MAX); in validate_nla()
396 if (nla_attr_len[pt->type] && attrlen != nla_attr_len[pt->type]) { in validate_nla()
398 current->comm, type); in validate_nla()
402 return -EINVAL; in validate_nla()
407 if ((pt->type == NLA_NESTED || pt->type == NLA_NESTED_ARRAY) && in validate_nla()
408 !(nla->nla_type & NLA_F_NESTED)) { in validate_nla()
411 return -EINVAL; in validate_nla()
413 if (pt->type != NLA_NESTED && pt->type != NLA_NESTED_ARRAY && in validate_nla()
414 pt->type != NLA_UNSPEC && (nla->nla_type & NLA_F_NESTED)) { in validate_nla()
417 return -EINVAL; in validate_nla()
421 switch (pt->type) { in validate_nla()
423 if (extack && pt->reject_message) { in validate_nla()
425 extack->_msg = pt->reject_message; in validate_nla()
426 return -EINVAL; in validate_nla()
428 err = -EINVAL; in validate_nla()
440 err = validate_nla_bitfield32(nla, pt->bitfield32_valid); in validate_nla()
446 if (pt->len) in validate_nla()
447 minlen = min_t(int, attrlen, pt->len + 1); in validate_nla()
452 err = -EINVAL; in validate_nla()
461 if (pt->len) { in validate_nla()
464 if (buf[attrlen - 1] == '\0') in validate_nla()
465 attrlen--; in validate_nla()
467 if (attrlen > pt->len) in validate_nla()
473 if (pt->len && attrlen > pt->len) in validate_nla()
485 if (pt->nested_policy) { in validate_nla()
487 pt->len, pt->nested_policy, in validate_nla()
507 if (pt->nested_policy) { in validate_nla()
511 pt->len, pt->nested_policy, in validate_nla()
527 return -EINVAL; in validate_nla()
529 if (attrlen < pt->len) in validate_nla()
534 if (pt->len) in validate_nla()
535 minlen = pt->len; in validate_nla()
537 minlen = nla_attr_minlen[pt->type]; in validate_nla()
544 switch (pt->validation_type) { in validate_nla()
563 if (pt->validate) { in validate_nla()
564 err = pt->validate(nla, extack); in validate_nla()
578 static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype, in __nla_validate_parse() argument
590 return -EINVAL; in __nla_validate_parse()
596 nla_for_each_attr(nla, head, len, rem) { in __nla_validate_parse()
603 return -EINVAL; in __nla_validate_parse()
622 rem, current->comm); in __nla_validate_parse()
625 return -EINVAL; in __nla_validate_parse()
632 * __nla_validate - Validate a stream of attributes
634 * @len: length of attribute stream
647 int __nla_validate(const struct nlattr *head, int len, int maxtype, in __nla_validate() argument
651 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_validate()
657 * nla_policy_len - Determine the max. length of a policy
670 int i, len = 0; in nla_policy_len() local
673 if (p->len) in nla_policy_len()
674 len += nla_total_size(p->len); in nla_policy_len()
675 else if (nla_attr_len[p->type]) in nla_policy_len()
676 len += nla_total_size(nla_attr_len[p->type]); in nla_policy_len()
677 else if (nla_attr_minlen[p->type]) in nla_policy_len()
678 len += nla_total_size(nla_attr_minlen[p->type]); in nla_policy_len()
681 return len; in nla_policy_len()
686 * __nla_parse - Parse a stream of attributes into a tb buffer
690 * @len: length of attribute stream
702 const struct nlattr *head, int len, in __nla_parse() argument
706 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_parse()
712 * nla_find - Find a specific attribute in a stream of attributes
714 * @len: length of attribute stream
719 struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype) in nla_find() argument
724 nla_for_each_attr(nla, head, len, rem) in nla_find()
733 * nla_strscpy - Copy string attribute payload into a sized buffer
738 * Copies at most dstsize - 1 bytes into the destination buffer.
742 * * srclen - Returns @nla length (not including the trailing %NUL).
743 * * -E2BIG - If @dstsize is 0 or greater than U16_MAX or @nla length greater
751 size_t len; in nla_strscpy() local
754 return -E2BIG; in nla_strscpy()
756 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strscpy()
757 srclen--; in nla_strscpy()
760 len = dstsize - 1; in nla_strscpy()
761 ret = -E2BIG; in nla_strscpy()
763 len = srclen; in nla_strscpy()
764 ret = len; in nla_strscpy()
767 memcpy(dst, src, len); in nla_strscpy()
769 memset(dst + len, 0, dstsize - len); in nla_strscpy()
776 * nla_strdup - Copy string attribute payload into a newly allocated buffer
787 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strdup()
788 srclen--; in nla_strdup()
800 * nla_memcpy - Copy a netlink attribute into another memory area
816 memset(dest + minlen, 0, count - minlen); in nla_memcpy()
823 * nla_memcmp - Compare an attribute with sized memory area
831 int d = nla_len(nla) - size; in nla_memcmp()
841 * nla_strcmp - Compare a string attribute against a string
847 int len = strlen(str); in nla_strcmp() local
852 while (attrlen > 0 && buf[attrlen - 1] == '\0') in nla_strcmp()
853 attrlen--; in nla_strcmp()
855 d = attrlen - len; in nla_strcmp()
857 d = memcmp(nla_data(nla), str, len); in nla_strcmp()
865 * __nla_reserve - reserve room for attribute on the skb
881 nla->nla_type = attrtype; in __nla_reserve()
882 nla->nla_len = nla_attr_size(attrlen); in __nla_reserve()
884 memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen)); in __nla_reserve()
891 * __nla_reserve_64bit - reserve room for attribute on the skb and align it
899 * attribute will have a 64-bit aligned nla_data() area.
914 * __nla_reserve_nohdr - reserve room for attribute without header
930 * nla_reserve - reserve room for attribute on the skb
951 * nla_reserve_64bit - reserve room for attribute on the skb and align it
959 * attribute will have a 64-bit aligned nla_data() area.
967 size_t len; in nla_reserve_64bit() local
970 len = nla_total_size_64bit(attrlen); in nla_reserve_64bit()
972 len = nla_total_size(attrlen); in nla_reserve_64bit()
973 if (unlikely(skb_tailroom(skb) < len)) in nla_reserve_64bit()
981 * nla_reserve_nohdr - reserve room for attribute without header
1000 * __nla_put - Add a netlink attribute to a socket buffer
1020 * __nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1041 * __nla_put_nohdr - Add a netlink attribute without header
1059 * nla_put - Add a netlink attribute to a socket buffer
1065 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1071 return -EMSGSIZE; in nla_put()
1079 * nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1086 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1092 size_t len; in nla_put_64bit() local
1095 len = nla_total_size_64bit(attrlen); in nla_put_64bit()
1097 len = nla_total_size(attrlen); in nla_put_64bit()
1098 if (unlikely(skb_tailroom(skb) < len)) in nla_put_64bit()
1099 return -EMSGSIZE; in nla_put_64bit()
1107 * nla_put_nohdr - Add a netlink attribute without header
1112 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1118 return -EMSGSIZE; in nla_put_nohdr()
1126 * nla_append - Add a netlink attribute without header or padding
1131 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1137 return -EMSGSIZE; in nla_append()