]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
genetlink: fix genl_bind() invoking bind() after -EPERM
authorAlok Tiwari <alok.a.tiwari@oracle.com>
Fri, 5 Sep 2025 13:57:27 +0000 (06:57 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 19 Sep 2025 14:35:48 +0000 (16:35 +0200)
[ Upstream commit 1dbfb0363224f6da56f6655d596dc5097308d6f5 ]

Per family bind/unbind callbacks were introduced to allow families
to track multicast group consumer presence, e.g. to start or stop
producing events depending on listeners.

However, in genl_bind() the bind() callback was invoked even if
capability checks failed and ret was set to -EPERM. This means that
callbacks could run on behalf of unauthorized callers while the
syscall still returned failure to user space.

Fix this by only invoking bind() after "if (ret) break;" check
i.e. after permission checks have succeeded.

Fixes: 3de21a8990d3 ("genetlink: Add per family bind/unbind callbacks")
Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
Link: https://patch.msgid.link/20250905135731.3026965-1-alok.a.tiwari@oracle.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/netlink/genetlink.c

index 07ad65774fe298a1fea8e67413521252fc31ed20..3327d84518141ffaa68280d95264eb3049eb33d7 100644 (file)
@@ -1836,6 +1836,9 @@ static int genl_bind(struct net *net, int group)
                    !ns_capable(net->user_ns, CAP_SYS_ADMIN))
                        ret = -EPERM;
 
+               if (ret)
+                       break;
+
                if (family->bind)
                        family->bind(i);