Lines Matching +full:min +full:- +full:len
1 // SPDX-License-Identifier: GPL-2.0
60 static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
72 return -EINVAL; in validate_nla_bitfield32()
75 if (bf->selector & ~valid_flags_mask) in validate_nla_bitfield32()
76 return -EINVAL; in validate_nla_bitfield32()
79 if (bf->value & ~valid_flags_mask) in validate_nla_bitfield32()
80 return -EINVAL; in validate_nla_bitfield32()
83 if (bf->value & ~bf->selector) in validate_nla_bitfield32()
84 return -EINVAL; in validate_nla_bitfield32()
89 static int nla_validate_array(const struct nlattr *head, int len, int maxtype, in nla_validate_array() argument
97 nla_for_each_attr(entry, head, len, rem) { in nla_validate_array()
106 return -ERANGE; in nla_validate_array()
122 WARN_ON_ONCE(pt->validation_type != NLA_VALIDATE_RANGE_PTR && in nla_get_range_unsigned()
123 (pt->min < 0 || pt->max < 0)); in nla_get_range_unsigned()
125 range->min = 0; in nla_get_range_unsigned()
127 switch (pt->type) { in nla_get_range_unsigned()
129 range->max = U8_MAX; in nla_get_range_unsigned()
134 range->max = U16_MAX; in nla_get_range_unsigned()
138 range->max = U32_MAX; in nla_get_range_unsigned()
143 range->max = U64_MAX; in nla_get_range_unsigned()
150 switch (pt->validation_type) { in nla_get_range_unsigned()
153 range->min = pt->min; in nla_get_range_unsigned()
154 range->max = pt->max; in nla_get_range_unsigned()
157 *range = *pt->range; in nla_get_range_unsigned()
160 range->min = pt->min; in nla_get_range_unsigned()
163 range->max = pt->max; in nla_get_range_unsigned()
178 switch (pt->type) { in nla_validate_range_unsigned()
207 return -EINVAL; in nla_validate_range_unsigned()
212 if (pt->validation_type == NLA_VALIDATE_RANGE_WARN_TOO_LONG && in nla_validate_range_unsigned()
213 pt->type == NLA_BINARY && value > range.max) { in nla_validate_range_unsigned()
215 current->comm, pt->type); in nla_validate_range_unsigned()
219 return -EINVAL; in nla_validate_range_unsigned()
222 /* this assumes min <= max (don't validate against min) */ in nla_validate_range_unsigned()
226 if (value < range.min || value > range.max) { in nla_validate_range_unsigned()
227 bool binary = pt->type == NLA_BINARY; in nla_validate_range_unsigned()
236 return -ERANGE; in nla_validate_range_unsigned()
245 switch (pt->type) { in nla_get_range_signed()
247 range->min = S8_MIN; in nla_get_range_signed()
248 range->max = S8_MAX; in nla_get_range_signed()
251 range->min = S16_MIN; in nla_get_range_signed()
252 range->max = S16_MAX; in nla_get_range_signed()
255 range->min = S32_MIN; in nla_get_range_signed()
256 range->max = S32_MAX; in nla_get_range_signed()
260 range->min = S64_MIN; in nla_get_range_signed()
261 range->max = S64_MAX; in nla_get_range_signed()
268 switch (pt->validation_type) { in nla_get_range_signed()
270 range->min = pt->min; in nla_get_range_signed()
271 range->max = pt->max; in nla_get_range_signed()
274 *range = *pt->range_signed; in nla_get_range_signed()
277 range->min = pt->min; in nla_get_range_signed()
280 range->max = pt->max; in nla_get_range_signed()
294 switch (pt->type) { in nla_validate_int_range_signed()
311 return -EINVAL; in nla_validate_int_range_signed()
316 if (value < range.min || value > range.max) { in nla_validate_int_range_signed()
319 return -ERANGE; in nla_validate_int_range_signed()
330 switch (pt->type) { in nla_validate_int_range()
349 return -EINVAL; in nla_validate_int_range()
359 switch (pt->type) { in nla_validate_mask()
382 return -EINVAL; in nla_validate_mask()
385 if (value & ~(u64)pt->mask) { in nla_validate_mask()
387 return -EINVAL; in nla_validate_mask()
400 int err = -ERANGE; in validate_nla()
411 BUG_ON(pt->type > NLA_TYPE_MAX); in validate_nla()
413 if (nla_attr_len[pt->type] && attrlen != nla_attr_len[pt->type]) { in validate_nla()
415 current->comm, type); in validate_nla()
419 return -EINVAL; in validate_nla()
424 if ((pt->type == NLA_NESTED || pt->type == NLA_NESTED_ARRAY) && in validate_nla()
425 !(nla->nla_type & NLA_F_NESTED)) { in validate_nla()
428 return -EINVAL; in validate_nla()
430 if (pt->type != NLA_NESTED && pt->type != NLA_NESTED_ARRAY && in validate_nla()
431 pt->type != NLA_UNSPEC && (nla->nla_type & NLA_F_NESTED)) { in validate_nla()
434 return -EINVAL; in validate_nla()
438 switch (pt->type) { in validate_nla()
440 if (extack && pt->reject_message) { in validate_nla()
442 extack->_msg = pt->reject_message; in validate_nla()
443 return -EINVAL; in validate_nla()
445 err = -EINVAL; in validate_nla()
458 return -EINVAL; in validate_nla()
466 err = validate_nla_bitfield32(nla, pt->bitfield32_valid); in validate_nla()
472 if (pt->len) in validate_nla()
473 minlen = min_t(int, attrlen, pt->len + 1); in validate_nla()
478 err = -EINVAL; in validate_nla()
487 if (pt->len) { in validate_nla()
490 if (buf[attrlen - 1] == '\0') in validate_nla()
491 attrlen--; in validate_nla()
493 if (attrlen > pt->len) in validate_nla()
499 if (pt->len && attrlen > pt->len) in validate_nla()
511 if (pt->nested_policy) { in validate_nla()
513 pt->len, pt->nested_policy, in validate_nla()
533 if (pt->nested_policy) { in validate_nla()
537 pt->len, pt->nested_policy, in validate_nla()
553 return -EINVAL; in validate_nla()
555 if (attrlen < pt->len) in validate_nla()
560 if (pt->len) in validate_nla()
561 minlen = pt->len; in validate_nla()
563 minlen = nla_attr_minlen[pt->type]; in validate_nla()
570 switch (pt->validation_type) { in validate_nla()
589 if (pt->validate) { in validate_nla()
590 err = pt->validate(nla, extack); in validate_nla()
604 static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype, in __nla_validate_parse() argument
616 return -EINVAL; in __nla_validate_parse()
622 nla_for_each_attr(nla, head, len, rem) { in __nla_validate_parse()
629 return -EINVAL; in __nla_validate_parse()
648 rem, current->comm); in __nla_validate_parse()
651 return -EINVAL; in __nla_validate_parse()
658 * __nla_validate - Validate a stream of attributes
660 * @len: length of attribute stream
673 int __nla_validate(const struct nlattr *head, int len, int maxtype, in __nla_validate() argument
677 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_validate()
683 * nla_policy_len - Determine the max. length of a policy
696 int i, len = 0; in nla_policy_len() local
699 if (p->len) in nla_policy_len()
700 len += nla_total_size(p->len); in nla_policy_len()
701 else if (nla_attr_len[p->type]) in nla_policy_len()
702 len += nla_total_size(nla_attr_len[p->type]); in nla_policy_len()
703 else if (nla_attr_minlen[p->type]) in nla_policy_len()
704 len += nla_total_size(nla_attr_minlen[p->type]); in nla_policy_len()
707 return len; in nla_policy_len()
712 * __nla_parse - Parse a stream of attributes into a tb buffer
716 * @len: length of attribute stream
728 const struct nlattr *head, int len, in __nla_parse() argument
732 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_parse()
738 * nla_find - Find a specific attribute in a stream of attributes
740 * @len: length of attribute stream
745 struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype) in nla_find() argument
750 nla_for_each_attr(nla, head, len, rem) in nla_find()
759 * nla_strscpy - Copy string attribute payload into a sized buffer
764 * Copies at most dstsize - 1 bytes into the destination buffer.
768 * * srclen - Returns @nla length (not including the trailing %NUL).
769 * * -E2BIG - If @dstsize is 0 or greater than U16_MAX or @nla length greater
777 size_t len; in nla_strscpy() local
780 return -E2BIG; in nla_strscpy()
782 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strscpy()
783 srclen--; in nla_strscpy()
786 len = dstsize - 1; in nla_strscpy()
787 ret = -E2BIG; in nla_strscpy()
789 len = srclen; in nla_strscpy()
790 ret = len; in nla_strscpy()
793 memcpy(dst, src, len); in nla_strscpy()
795 memset(dst + len, 0, dstsize - len); in nla_strscpy()
802 * nla_strdup - Copy string attribute payload into a newly allocated buffer
813 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strdup()
814 srclen--; in nla_strdup()
826 * nla_memcpy - Copy a netlink attribute into another memory area
842 memset(dest + minlen, 0, count - minlen); in nla_memcpy()
849 * nla_memcmp - Compare an attribute with sized memory area
857 int d = nla_len(nla) - size; in nla_memcmp()
867 * nla_strcmp - Compare a string attribute against a string
873 int len = strlen(str); in nla_strcmp() local
878 while (attrlen > 0 && buf[attrlen - 1] == '\0') in nla_strcmp()
879 attrlen--; in nla_strcmp()
881 d = attrlen - len; in nla_strcmp()
883 d = memcmp(nla_data(nla), str, len); in nla_strcmp()
891 * __nla_reserve - reserve room for attribute on the skb
907 nla->nla_type = attrtype; in __nla_reserve()
908 nla->nla_len = nla_attr_size(attrlen); in __nla_reserve()
910 memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen)); in __nla_reserve()
917 * __nla_reserve_64bit - reserve room for attribute on the skb and align it
925 * attribute will have a 64-bit aligned nla_data() area.
940 * __nla_reserve_nohdr - reserve room for attribute without header
956 * nla_reserve - reserve room for attribute on the skb
977 * nla_reserve_64bit - reserve room for attribute on the skb and align it
985 * attribute will have a 64-bit aligned nla_data() area.
993 size_t len; in nla_reserve_64bit() local
996 len = nla_total_size_64bit(attrlen); in nla_reserve_64bit()
998 len = nla_total_size(attrlen); in nla_reserve_64bit()
999 if (unlikely(skb_tailroom(skb) < len)) in nla_reserve_64bit()
1007 * nla_reserve_nohdr - reserve room for attribute without header
1026 * __nla_put - Add a netlink attribute to a socket buffer
1046 * __nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1067 * __nla_put_nohdr - Add a netlink attribute without header
1085 * nla_put - Add a netlink attribute to a socket buffer
1091 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1097 return -EMSGSIZE; in nla_put()
1105 * nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1112 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1118 size_t len; in nla_put_64bit() local
1121 len = nla_total_size_64bit(attrlen); in nla_put_64bit()
1123 len = nla_total_size(attrlen); in nla_put_64bit()
1124 if (unlikely(skb_tailroom(skb) < len)) in nla_put_64bit()
1125 return -EMSGSIZE; in nla_put_64bit()
1133 * nla_put_nohdr - Add a netlink attribute without header
1138 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1144 return -EMSGSIZE; in nla_put_nohdr()
1152 * nla_append - Add a netlink attribute without header or padding
1157 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1163 return -EMSGSIZE; in nla_append()