]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nexthop: Check NLM_F_REPLACE and NHA_ID in rtm_new_nexthop().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 19 Mar 2025 23:06:49 +0000 (16:06 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Mar 2025 14:31:59 +0000 (07:31 -0700)
nexthop_add() checks if NLM_F_REPLACE is specified without
non-zero NHA_ID, which does not require RTNL.

Let's move the check to rtm_new_nexthop().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250319230743.65267-5-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/nexthop.c

index 426cdf301c6fa220849367b69dc0dc1c824cef14..fb129c830040692b028a5e0b44e926b5dc37df67 100644 (file)
@@ -2928,11 +2928,6 @@ static struct nexthop *nexthop_add(struct net *net, struct nh_config *cfg,
        struct nexthop *nh;
        int err;
 
-       if (cfg->nlflags & NLM_F_REPLACE && !cfg->nh_id) {
-               NL_SET_ERR_MSG(extack, "Replace requires nexthop id");
-               return ERR_PTR(-EINVAL);
-       }
-
        if (!cfg->nh_id) {
                cfg->nh_id = nh_find_unused_id(net);
                if (!cfg->nh_id) {
@@ -3247,6 +3242,12 @@ static int rtm_new_nexthop(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (err)
                goto out;
 
+       if (cfg.nlflags & NLM_F_REPLACE && !cfg.nh_id) {
+               NL_SET_ERR_MSG(extack, "Replace requires nexthop id");
+               err = -EINVAL;
+               goto out;
+       }
+
        err = rtm_to_nh_config_rtnl(net, tb, &cfg, extack);
        if (err)
                goto out;