diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/netlink.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/include/net/netlink.h b/include/net/netlink.h index a5506c42f03c..112dcdf7e34e 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
| @@ -772,12 +772,13 @@ static inline int __nla_parse_nested_compat(struct nlattr *tb[], int maxtype, | |||
| 772 | const struct nla_policy *policy, | 772 | const struct nla_policy *policy, |
| 773 | int len) | 773 | int len) |
| 774 | { | 774 | { |
| 775 | if (nla_len(nla) < len) | 775 | int nested_len = nla_len(nla) - NLA_ALIGN(len); |
| 776 | |||
| 777 | if (nested_len < 0) | ||
| 776 | return -1; | 778 | return -1; |
| 777 | if (nla_len(nla) >= NLA_ALIGN(len) + sizeof(struct nlattr)) | 779 | if (nested_len >= nla_attr_size(0)) |
| 778 | return nla_parse_nested(tb, maxtype, | 780 | return nla_parse(tb, maxtype, nla_data(nla) + NLA_ALIGN(len), |
| 779 | nla_data(nla) + NLA_ALIGN(len), | 781 | nested_len, policy); |
| 780 | policy); | ||
| 781 | memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); | 782 | memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); |
| 782 | return 0; | 783 | return 0; |
| 783 | } | 784 | } |
