|
@@ -772,12 +772,13 @@ static inline int __nla_parse_nested_compat(struct nlattr *tb[], int maxtype,
|
|
const struct nla_policy *policy,
|
|
const struct nla_policy *policy,
|
|
int len)
|
|
int len)
|
|
{
|
|
{
|
|
- if (nla_len(nla) < len)
|
|
|
|
|
|
+ int nested_len = nla_len(nla) - NLA_ALIGN(len);
|
|
|
|
+
|
|
|
|
+ if (nested_len < 0)
|
|
return -1;
|
|
return -1;
|
|
- if (nla_len(nla) >= NLA_ALIGN(len) + sizeof(struct nlattr))
|
|
|
|
- return nla_parse_nested(tb, maxtype,
|
|
|
|
- nla_data(nla) + NLA_ALIGN(len),
|
|
|
|
- policy);
|
|
|
|
|
|
+ if (nested_len >= nla_attr_size(0))
|
|
|
|
+ return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len),
|
|
|
|
+ nested_len, policy);
|
|
memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
|
|
memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|