/** * Validate Generic Netlink message including attributes * @arg nlh Pointer to Netlink message header * @arg hdrlen Length of user header * @arg maxtype Maximum attribtue id expected * @arg policy Attribute validation policy * * Verifies the validity of the Netlink and Generic Netlink headers using * genlmsg_valid_hdr() and calls nla_validate() on the message payload to * verify the integrity of eventual attributes. * * @note You may call genlmsg_parse() directly to perform validation and * parsing in a single step. * * @see genlmsg_valid_hdr() * @see nla_validate() * @see genlmsg_parse() * * @return 0 on success or a negative error code. */ int genlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy) { struct genlmsghdr *ghdr; if (!genlmsg_valid_hdr(nlh, hdrlen)) return -NLE_MSG_TOOSHORT; ghdr = nlmsg_data(nlh); return nla_validate(genlmsg_attrdata(ghdr, hdrlen), genlmsg_attrlen(ghdr, hdrlen), maxtype, policy); }
int genlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy) { struct genlmsghdr *ghdr; if (!genlmsg_valid_hdr(nlh, hdrlen)) return nl_errno(EINVAL); ghdr = nlmsg_data(nlh); return nla_validate(genlmsg_attrdata(ghdr, hdrlen), genlmsg_attrlen(ghdr, hdrlen), maxtype, policy); }
static int tunnel_key_copy_opts(const struct nlattr *nla, u8 *dst, int dst_len, struct netlink_ext_ack *extack) { int err, rem, opt_len, len = nla_len(nla), opts_len = 0; const struct nlattr *attr, *head = nla_data(nla); err = nla_validate(head, len, TCA_TUNNEL_KEY_ENC_OPTS_MAX, enc_opts_policy, extack); if (err) return err; nla_for_each_attr(attr, head, len, rem) { switch (nla_type(attr)) { case TCA_TUNNEL_KEY_ENC_OPTS_GENEVE: opt_len = tunnel_key_copy_geneve_opt(attr, dst, dst_len, extack); if (opt_len < 0) return opt_len; opts_len += opt_len; if (dst) { dst_len -= opt_len; dst += opt_len; } break; } } if (!opts_len) { NL_SET_ERR_MSG(extack, "Empty list of tunnel options"); return -EINVAL; } if (rem > 0) { NL_SET_ERR_MSG(extack, "Trailing data after parsing tunnel key options attributes"); return -EINVAL; } return opts_len; }