]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rtnetlink: Call validate_linkmsg() in do_setlink().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 16 Oct 2024 18:53:45 +0000 (11:53 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Oct 2024 09:02:04 +0000 (11:02 +0200)
There are 3 paths that finally call do_setlink(), and validate_linkmsg()
is called in each path.

  1. RTM_NEWLINK
    1-1. dev is found in __rtnl_newlink()
    1-2. dev isn't found, but IFLA_GROUP is specified in
          rtnl_group_changelink()
  2. RTM_SETLINK

The next patch factorises 1-1 to a separate function.

As a preparation, let's move validate_linkmsg() calls to do_setlink().

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 37193402a42c4057a53a6148d08303e507d447de..76593de7014c9b9697650428b0644ebbeabf057f 100644 (file)
@@ -2855,6 +2855,10 @@ static int do_setlink(const struct sk_buff *skb,
        char ifname[IFNAMSIZ];
        int err;
 
+       err = validate_linkmsg(dev, tb, extack);
+       if (err < 0)
+               goto errout;
+
        if (tb[IFLA_IFNAME])
                nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
        else
@@ -3269,10 +3273,6 @@ static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
                goto errout;
        }
 
-       err = validate_linkmsg(dev, tb, extack);
-       if (err < 0)
-               goto errout;
-
        err = do_setlink(skb, dev, ifm, extack, tb, 0);
 errout:
        return err;
@@ -3516,9 +3516,6 @@ static int rtnl_group_changelink(const struct sk_buff *skb,
 
        for_each_netdev_safe(net, dev, aux) {
                if (dev->group == group) {
-                       err = validate_linkmsg(dev, tb, extack);
-                       if (err < 0)
-                               return err;
                        err = do_setlink(skb, dev, ifm, extack, tb, 0);
                        if (err < 0)
                                return err;
@@ -3744,10 +3741,6 @@ replay:
                if (nlh->nlmsg_flags & NLM_F_REPLACE)
                        return -EOPNOTSUPP;
 
-               err = validate_linkmsg(dev, tb, extack);
-               if (err < 0)
-                       return err;
-
                if (linkinfo[IFLA_INFO_DATA]) {
                        if (!ops || ops != dev->rtnl_link_ops ||
                            !ops->changelink)