]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipmr: Use MAXVIFS in mroute_msgsize().
authorKuniyuki Iwashima <kuniyu@google.com>
Sat, 28 Feb 2026 22:17:22 +0000 (22:17 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 3 Mar 2026 02:49:39 +0000 (18:49 -0800)
mroute_msgsize() calculates skb size needed for ipmr_fill_mroute().

The size differs based on mrt->maxvif.

We will drop RTNL for ipmr_rtm_getroute() and mrt->maxvif may
change under RCU.

To avoid -EMSGSIZE, let's calculate the size with the maximum
value of mrt->maxvif, MAXVIFS.

struct rtnexthop is 8 bytes and MAXVIFS is 32, so the maximum delta
is 256 bytes, which is small enough.

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

index eecc79a835d17513d60ae116cafc427477193624..9f2dd726affb52a8e2eca86f6d3d5fcdd47af83f 100644 (file)
@@ -2510,7 +2510,7 @@ static int _ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
                                cmd, flags);
 }
 
-static size_t mroute_msgsize(bool unresolved, int maxvif)
+static size_t mroute_msgsize(bool unresolved)
 {
        size_t len =
                NLMSG_ALIGN(sizeof(struct rtmsg))
@@ -2523,7 +2523,7 @@ static size_t mroute_msgsize(bool unresolved, int maxvif)
                len = len
                      + nla_total_size(4)       /* RTA_IIF */
                      + nla_total_size(0)       /* RTA_MULTIPATH */
-                     + maxvif * NLA_ALIGN(sizeof(struct rtnexthop))
+                     + MAXVIFS * NLA_ALIGN(sizeof(struct rtnexthop))
                                                /* RTA_MFC_STATS */
                      + nla_total_size_64bit(sizeof(struct rta_mfc_stats))
                ;
@@ -2538,8 +2538,7 @@ static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
        struct sk_buff *skb;
        int err = -ENOBUFS;
 
-       skb = nlmsg_new(mroute_msgsize(mfc->_c.mfc_parent >= MAXVIFS,
-                                      mrt->maxvif),
+       skb = nlmsg_new(mroute_msgsize(mfc->_c.mfc_parent >= MAXVIFS),
                        GFP_ATOMIC);
        if (!skb)
                goto errout;
@@ -2711,7 +2710,7 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
                goto errout_free;
        }
 
-       skb = nlmsg_new(mroute_msgsize(false, mrt->maxvif), GFP_KERNEL);
+       skb = nlmsg_new(mroute_msgsize(false), GFP_KERNEL);
        if (!skb) {
                err = -ENOBUFS;
                goto errout_free;