]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ethtool: rss: avoid modifying the RSS context response
authorJakub Kicinski <kuba@kernel.org>
Fri, 22 May 2026 23:06:42 +0000 (16:06 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 26 May 2026 15:17:56 +0000 (08:17 -0700)
Gemini says that we're modifying the RSS_CREATE response skb.
I think it's right, the comment says that unicast() should
unshare the skb but I'm not entirely sure what I meant there.
netlink_trim() does a copy but only if skb is not well sized
(it's at least 2x larger than necessary for the payload).

Fixes: a166ab7816c5 ("ethtool: rss: support creating contexts via Netlink")
Link: https://patch.msgid.link/20260522230647.1705600-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/rss.c

index 353110b862ab1398699c19daf16082ee743505b1..8ffec9785efa82b240bfa33101a5dd039a3fc811 100644 (file)
@@ -981,11 +981,17 @@ ethnl_rss_create_validate(struct net_device *dev, struct genl_info *info)
 }
 
 static void
-ethnl_rss_create_send_ntf(struct sk_buff *rsp, struct net_device *dev)
+ethnl_rss_create_send_ntf(const struct sk_buff *rsp, struct net_device *dev)
 {
-       struct nlmsghdr *nlh = (void *)rsp->data;
        struct genlmsghdr *genl_hdr;
+       struct nlmsghdr *nlh;
+       struct sk_buff *ntf;
+
+       ntf = skb_copy_expand(rsp, 0, 0, GFP_KERNEL);
+       if (!ntf)
+               return;
 
+       nlh = nlmsg_hdr(ntf);
        /* Convert the reply into a notification */
        nlh->nlmsg_pid = 0;
        nlh->nlmsg_seq = ethnl_bcast_seq_next();
@@ -993,7 +999,7 @@ ethnl_rss_create_send_ntf(struct sk_buff *rsp, struct net_device *dev)
        genl_hdr = nlmsg_data(nlh);
        genl_hdr->cmd = ETHTOOL_MSG_RSS_CREATE_NTF;
 
-       ethnl_multicast(rsp, dev);
+       ethnl_multicast(ntf, dev);
 }
 
 int ethnl_rss_create_doit(struct sk_buff *skb, struct genl_info *info)
@@ -1104,12 +1110,8 @@ int ethnl_rss_create_doit(struct sk_buff *skb, struct genl_info *info)
 
        genlmsg_end(rsp, hdr);
 
-       /* Use the same skb for the response and the notification,
-        * genlmsg_reply() will copy the skb if it has elevated user count.
-        */
-       skb_get(rsp);
-       ret = genlmsg_reply(rsp, info);
        ethnl_rss_create_send_ntf(rsp, dev);
+       ret = genlmsg_reply(rsp, info);
        rsp = NULL;
 
 exit_unlock: