mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
netlink: export policy in extended ACK
Add a new attribute NLMSGERR_ATTR_POLICY to the extended ACK to advertise the policy, e.g. if an attribute was out of range, you'll know the range that's permissible. Add new NL_SET_ERR_MSG_ATTR_POL() and NL_SET_ERR_MSG_ATTR_POL() macros to set this, since realistically it's only useful to do this when the bad attribute (offset) is also returned. Use it in lib/nlattr.c which practically does all the policy validation. v2: - add and use netlink_policy_dump_attr_size_estimate() v3: - remove redundant break v4: - really remove redundant break ... sorry Reviewed-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
d2681e93b0
commit
44f3625bc6
35
lib/nlattr.c
35
lib/nlattr.c
@@ -96,8 +96,8 @@ static int nla_validate_array(const struct nlattr *head, int len, int maxtype,
|
||||
continue;
|
||||
|
||||
if (nla_len(entry) < NLA_HDRLEN) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, entry,
|
||||
"Array element too short");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, entry, policy,
|
||||
"Array element too short");
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
@@ -195,8 +195,8 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
|
||||
pr_warn_ratelimited("netlink: '%s': attribute type %d has an invalid length.\n",
|
||||
current->comm, pt->type);
|
||||
if (validate & NL_VALIDATE_STRICT_ATTRS) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"invalid attribute length");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"invalid attribute length");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -208,11 +208,11 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
|
||||
bool binary = pt->type == NLA_BINARY;
|
||||
|
||||
if (binary)
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"binary attribute size out of range");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"binary attribute size out of range");
|
||||
else
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"integer out of range");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"integer out of range");
|
||||
|
||||
return -ERANGE;
|
||||
}
|
||||
@@ -291,8 +291,8 @@ static int nla_validate_int_range_signed(const struct nla_policy *pt,
|
||||
nla_get_range_signed(pt, &range);
|
||||
|
||||
if (value < range.min || value > range.max) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"integer out of range");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"integer out of range");
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
@@ -377,8 +377,8 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
|
||||
pr_warn_ratelimited("netlink: '%s': attribute type %d has an invalid length.\n",
|
||||
current->comm, type);
|
||||
if (validate & NL_VALIDATE_STRICT_ATTRS) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"invalid attribute length");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"invalid attribute length");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@@ -386,14 +386,14 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
|
||||
if (validate & NL_VALIDATE_NESTED) {
|
||||
if ((pt->type == NLA_NESTED || pt->type == NLA_NESTED_ARRAY) &&
|
||||
!(nla->nla_type & NLA_F_NESTED)) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"NLA_F_NESTED is missing");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"NLA_F_NESTED is missing");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (pt->type != NLA_NESTED && pt->type != NLA_NESTED_ARRAY &&
|
||||
pt->type != NLA_UNSPEC && (nla->nla_type & NLA_F_NESTED)) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla,
|
||||
"NLA_F_NESTED not expected");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"NLA_F_NESTED not expected");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@@ -550,7 +550,8 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
|
||||
|
||||
return 0;
|
||||
out_err:
|
||||
NL_SET_ERR_MSG_ATTR(extack, nla, "Attribute failed policy validation");
|
||||
NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
|
||||
"Attribute failed policy validation");
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user