rtnetlink: Move simple validation from __rtnl_newlink() to rtnl_newlink().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 16 Oct 2024 18:53:47 +0000 (11:53 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Oct 2024 09:02:04 +0000 (11:02 +0200)
We will push RTNL down to rtnl_newlink().

Let's move RTNL-independent validation to rtnl_newlink().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/core/rtnetlink.c

index 21165cc2b697433175003c8acd4698b2ba0e85db..97d6ad65647c8b30b9ec9c78a94358c058f48217 100644 (file)
@@ -3707,15 +3707,6 @@ static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
 #ifdef CONFIG_MODULES
 replay:
 #endif
-       err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX,
-                                    ifla_policy, extack);
-       if (err < 0)
-               return err;
-
-       err = rtnl_ensure_unique_netns(tb, extack, false);
-       if (err < 0)
-               return err;
-
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0) {
                link_specified = true;
@@ -3731,16 +3722,6 @@ replay:
                dev = NULL;
        }
 
-       if (tb[IFLA_LINKINFO]) {
-               err = nla_parse_nested_deprecated(linkinfo, IFLA_INFO_MAX,
-                                                 tb[IFLA_LINKINFO],
-                                                 ifla_info_policy, NULL);
-               if (err < 0)
-                       return err;
-       } else {
-               memset(linkinfo, 0, sizeof(tbs->linkinfo));
-       }
-
        if (linkinfo[IFLA_INFO_KIND]) {
                nla_strscpy(kind, linkinfo[IFLA_INFO_KIND], sizeof(kind));
                ops = rtnl_link_ops_get(kind);
@@ -3809,6 +3790,7 @@ replay:
 static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
                        struct netlink_ext_ack *extack)
 {
+       struct nlattr **tb, **linkinfo;
        struct rtnl_newlink_tbs *tbs;
        int ret;
 
@@ -3816,7 +3798,30 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (!tbs)
                return -ENOMEM;
 
+       tb = tbs->tb;
+       ret = nlmsg_parse_deprecated(nlh, sizeof(struct ifinfomsg), tb,
+                                    IFLA_MAX, ifla_policy, extack);
+       if (ret < 0)
+               goto free;
+
+       ret = rtnl_ensure_unique_netns(tb, extack, false);
+       if (ret < 0)
+               goto free;
+
+       linkinfo = tbs->linkinfo;
+       if (tb[IFLA_LINKINFO]) {
+               ret = nla_parse_nested_deprecated(linkinfo, IFLA_INFO_MAX,
+                                                 tb[IFLA_LINKINFO],
+                                                 ifla_info_policy, NULL);
+               if (ret < 0)
+                       goto free;
+       } else {
+               memset(linkinfo, 0, sizeof(tbs->linkinfo));
+       }
+
        ret = __rtnl_newlink(skb, nlh, tbs, extack);
+
+free:
        kfree(tbs);
        return ret;
 }