mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 07:51:31 -04:00
ipmr: Use MAXVIFS in mroute_msgsize().
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
402a8111d7
commit
2bd6c9d600
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user