]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: netlink: fix sending unassigned nsid after assigned one
authorIlya Maximets <i.maximets@ovn.org>
Wed, 20 May 2026 17:22:35 +0000 (19:22 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 23 May 2026 00:11:09 +0000 (17:11 -0700)
If the current skb is not shared, it is re-used directly for all the
sockets subscribed to the notification.  If we have remote all-nsid
socket receiving a message first, then the 'nsid_is_set' will be
set to 'true'.  If the nsid is NOT_ASSIGNED for the next socket in
the list, the 'nsid_is_set' will remain 'true' and the negative value
is be delivered to the user space.  All subsequent nsid values will be
delivered as well, since there is no code path that sets the flag
back to 'false'.

Fix that by always dropping the flag to 'false' first.

Fixes: 7212462fa6fd ("netlink: don't send unknown nsid")
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Link: https://patch.msgid.link/20260520172317.175168-2-i.maximets@ovn.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/netlink/af_netlink.c

index 2aeb0680807d62ab62735ea2203cec57a37bfa25..0742e97f256e42c3fbec340535a3366a2132e5bf 100644 (file)
@@ -1482,6 +1482,7 @@ static void do_one_broadcast(struct sock *sk,
                p->skb2 = NULL;
                goto out;
        }
+       NETLINK_CB(p->skb2).nsid_is_set = false;
        NETLINK_CB(p->skb2).nsid = peernet2id(sock_net(sk), p->net);
        if (NETLINK_CB(p->skb2).nsid != NETNSA_NSID_NOT_ASSIGNED)
                NETLINK_CB(p->skb2).nsid_is_set = true;