Lines Matching +full:max +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()
129 range->max = U16_MAX; in nla_get_range_unsigned()
132 range->max = U32_MAX; in nla_get_range_unsigned()
136 range->max = U64_MAX; in nla_get_range_unsigned()
143 switch (pt->validation_type) { in nla_get_range_unsigned()
146 range->min = pt->min; in nla_get_range_unsigned()
147 range->max = pt->max; in nla_get_range_unsigned()
150 *range = *pt->range; in nla_get_range_unsigned()
153 range->min = pt->min; in nla_get_range_unsigned()
156 range->max = pt->max; in nla_get_range_unsigned()
171 switch (pt->type) { in nla_validate_range_unsigned()
189 return -EINVAL; in nla_validate_range_unsigned()
194 if (pt->validation_type == NLA_VALIDATE_RANGE_WARN_TOO_LONG && in nla_validate_range_unsigned()
195 pt->type == NLA_BINARY && value > range.max) { in nla_validate_range_unsigned()
197 current->comm, pt->type); in nla_validate_range_unsigned()
201 return -EINVAL; in nla_validate_range_unsigned()
204 /* this assumes min <= max (don't validate against min) */ in nla_validate_range_unsigned()
208 if (value < range.min || value > range.max) { in nla_validate_range_unsigned()
209 bool binary = pt->type == NLA_BINARY; in nla_validate_range_unsigned()
218 return -ERANGE; in nla_validate_range_unsigned()
227 switch (pt->type) { in nla_get_range_signed()
229 range->min = S8_MIN; in nla_get_range_signed()
230 range->max = S8_MAX; in nla_get_range_signed()
233 range->min = S16_MIN; in nla_get_range_signed()
234 range->max = S16_MAX; in nla_get_range_signed()
237 range->min = S32_MIN; in nla_get_range_signed()
238 range->max = S32_MAX; in nla_get_range_signed()
241 range->min = S64_MIN; in nla_get_range_signed()
242 range->max = S64_MAX; in nla_get_range_signed()
249 switch (pt->validation_type) { in nla_get_range_signed()
251 range->min = pt->min; in nla_get_range_signed()
252 range->max = pt->max; in nla_get_range_signed()
255 *range = *pt->range_signed; in nla_get_range_signed()
258 range->min = pt->min; in nla_get_range_signed()
261 range->max = pt->max; in nla_get_range_signed()
275 switch (pt->type) { in nla_validate_int_range_signed()
289 return -EINVAL; in nla_validate_int_range_signed()
294 if (value < range.min || value > range.max) { in nla_validate_int_range_signed()
297 return -ERANGE; in nla_validate_int_range_signed()
308 switch (pt->type) { in nla_validate_int_range()
323 return -EINVAL; in nla_validate_int_range()
333 switch (pt->type) { in nla_validate_mask()
347 return -EINVAL; in nla_validate_mask()
350 if (value & ~(u64)pt->mask) { in nla_validate_mask()
352 return -EINVAL; in nla_validate_mask()
365 int err = -ERANGE; in validate_nla()
376 BUG_ON(pt->type > NLA_TYPE_MAX); in validate_nla()
378 if (nla_attr_len[pt->type] && attrlen != nla_attr_len[pt->type]) { in validate_nla()
380 current->comm, type); in validate_nla()
384 return -EINVAL; in validate_nla()
389 if ((pt->type == NLA_NESTED || pt->type == NLA_NESTED_ARRAY) && in validate_nla()
390 !(nla->nla_type & NLA_F_NESTED)) { in validate_nla()
393 return -EINVAL; in validate_nla()
395 if (pt->type != NLA_NESTED && pt->type != NLA_NESTED_ARRAY && in validate_nla()
396 pt->type != NLA_UNSPEC && (nla->nla_type & NLA_F_NESTED)) { in validate_nla()
399 return -EINVAL; in validate_nla()
403 switch (pt->type) { in validate_nla()
405 if (extack && pt->reject_message) { in validate_nla()
407 extack->_msg = pt->reject_message; in validate_nla()
408 return -EINVAL; in validate_nla()
410 err = -EINVAL; in validate_nla()
422 err = validate_nla_bitfield32(nla, pt->bitfield32_valid); in validate_nla()
428 if (pt->len) in validate_nla()
429 minlen = min_t(int, attrlen, pt->len + 1); in validate_nla()
434 err = -EINVAL; in validate_nla()
443 if (pt->len) { in validate_nla()
446 if (buf[attrlen - 1] == '\0') in validate_nla()
447 attrlen--; in validate_nla()
449 if (attrlen > pt->len) in validate_nla()
455 if (pt->len && attrlen > pt->len) in validate_nla()
467 if (pt->nested_policy) { in validate_nla()
469 pt->len, pt->nested_policy, in validate_nla()
489 if (pt->nested_policy) { in validate_nla()
493 pt->len, pt->nested_policy, in validate_nla()
509 return -EINVAL; in validate_nla()
511 if (attrlen < pt->len) in validate_nla()
516 if (pt->len) in validate_nla()
517 minlen = pt->len; in validate_nla()
519 minlen = nla_attr_minlen[pt->type]; in validate_nla()
526 switch (pt->validation_type) { in validate_nla()
545 if (pt->validate) { in validate_nla()
546 err = pt->validate(nla, extack); in validate_nla()
560 static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype, in __nla_validate_parse() argument
572 return -EINVAL; in __nla_validate_parse()
578 nla_for_each_attr(nla, head, len, rem) { in __nla_validate_parse()
585 return -EINVAL; in __nla_validate_parse()
604 rem, current->comm); in __nla_validate_parse()
607 return -EINVAL; in __nla_validate_parse()
614 * __nla_validate - Validate a stream of attributes
616 * @len: length of attribute stream
629 int __nla_validate(const struct nlattr *head, int len, int maxtype, in __nla_validate() argument
633 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_validate()
639 * nla_policy_len - Determin the max. length of a policy
643 * Determines the max. length of the policy. It is currently used
652 int i, len = 0; in nla_policy_len() local
655 if (p->len) in nla_policy_len()
656 len += nla_total_size(p->len); in nla_policy_len()
657 else if (nla_attr_len[p->type]) in nla_policy_len()
658 len += nla_total_size(nla_attr_len[p->type]); in nla_policy_len()
659 else if (nla_attr_minlen[p->type]) in nla_policy_len()
660 len += nla_total_size(nla_attr_minlen[p->type]); in nla_policy_len()
663 return len; in nla_policy_len()
668 * __nla_parse - Parse a stream of attributes into a tb buffer
672 * @len: length of attribute stream
684 const struct nlattr *head, int len, in __nla_parse() argument
688 return __nla_validate_parse(head, len, maxtype, policy, validate, in __nla_parse()
694 * nla_find - Find a specific attribute in a stream of attributes
696 * @len: length of attribute stream
701 struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype) in nla_find() argument
706 nla_for_each_attr(nla, head, len, rem) in nla_find()
715 * nla_strlcpy - Copy string attribute payload into a sized buffer
720 * Copies at most dstsize - 1 bytes into the destination buffer.
721 * The result is always a valid NUL-terminated string. Unlike
731 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strlcpy()
732 srclen--; in nla_strlcpy()
735 size_t len = (srclen >= dstsize) ? dstsize - 1 : srclen; in nla_strlcpy() local
738 memcpy(dst, src, len); in nla_strlcpy()
746 * nla_strdup - Copy string attribute payload into a newly allocated buffer
757 if (srclen > 0 && src[srclen - 1] == '\0') in nla_strdup()
758 srclen--; in nla_strdup()
770 * nla_memcpy - Copy a netlink attribute into another memory area
786 memset(dest + minlen, 0, count - minlen); in nla_memcpy()
793 * nla_memcmp - Compare an attribute with sized memory area
801 int d = nla_len(nla) - size; in nla_memcmp()
811 * nla_strcmp - Compare a string attribute against a string
817 int len = strlen(str); in nla_strcmp() local
822 while (attrlen > 0 && buf[attrlen - 1] == '\0') in nla_strcmp()
823 attrlen--; in nla_strcmp()
825 d = attrlen - len; in nla_strcmp()
827 d = memcmp(nla_data(nla), str, len); in nla_strcmp()
835 * __nla_reserve - reserve room for attribute on the skb
851 nla->nla_type = attrtype; in __nla_reserve()
852 nla->nla_len = nla_attr_size(attrlen); in __nla_reserve()
854 memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen)); in __nla_reserve()
861 * __nla_reserve_64bit - reserve room for attribute on the skb and align it
869 * attribute will have a 64-bit aligned nla_data() area.
884 * __nla_reserve_nohdr - reserve room for attribute without header
900 * nla_reserve - reserve room for attribute on the skb
921 * nla_reserve_64bit - reserve room for attribute on the skb and align it
929 * attribute will have a 64-bit aligned nla_data() area.
937 size_t len; in nla_reserve_64bit() local
940 len = nla_total_size_64bit(attrlen); in nla_reserve_64bit()
942 len = nla_total_size(attrlen); in nla_reserve_64bit()
943 if (unlikely(skb_tailroom(skb) < len)) in nla_reserve_64bit()
951 * nla_reserve_nohdr - reserve room for attribute without header
970 * __nla_put - Add a netlink attribute to a socket buffer
990 * __nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1011 * __nla_put_nohdr - Add a netlink attribute without header
1029 * nla_put - Add a netlink attribute to a socket buffer
1035 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1041 return -EMSGSIZE; in nla_put()
1049 * nla_put_64bit - Add a netlink attribute to a socket buffer and align it
1056 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1062 size_t len; in nla_put_64bit() local
1065 len = nla_total_size_64bit(attrlen); in nla_put_64bit()
1067 len = nla_total_size(attrlen); in nla_put_64bit()
1068 if (unlikely(skb_tailroom(skb) < len)) in nla_put_64bit()
1069 return -EMSGSIZE; in nla_put_64bit()
1077 * nla_put_nohdr - Add a netlink attribute without header
1082 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1088 return -EMSGSIZE; in nla_put_nohdr()
1096 * nla_append - Add a netlink attribute without header or padding
1101 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
1107 return -EMSGSIZE; in nla_append()