@@ -340,6 +340,14 @@ static int veth_validate(struct nlattr *tb[], struct nlattr *data[],
if (!is_valid_veth_mtu(nla_get_u32(tb[IFLA_MTU])))
return -EINVAL;
}
+ if (data != NULL && data[VETH_INFO_PEER] != NULL) {
+ struct nlattr *nla_peer = data[VETH_INFO_PEER];
+
+ return rtnl_nla_validate_ifla(
+ nla_data(nla_peer) + sizeof(struct ifinfomsg),
+ nla_len(nla_peer) - sizeof(struct ifinfomsg),
+ strict);
+ }
return 0;
}
@@ -168,6 +168,7 @@ int rtnl_delete_link(struct net_device *dev);
int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm);
int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len);
+int rtnl_nla_validate_ifla(const struct nlattr *head, int len, bool strict);
#define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind)
@@ -1449,6 +1449,12 @@ int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len)
}
EXPORT_SYMBOL(rtnl_nla_parse_ifla);
+int rtnl_nla_validate_ifla(const struct nlattr *head, int len, bool strict)
+{
+ return nla_strict_validate(head, len, IFLA_MAX, strict, ifla_policy);
+}
+EXPORT_SYMBOL(rtnl_nla_validate_ifla);
+
struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[])
{
struct net *net;
For strict attribute checking, it's necessary to validate nested attributes in the validate rtnl_link_ops callback. Signed-off-by: Jiri Benc <jbenc@redhat.com> --- drivers/net/veth.c | 8 ++++++++ include/net/rtnetlink.h | 1 + net/core/rtnetlink.c | 6 ++++++ 3 files changed, 15 insertions(+)