-From stable-bounces@linux.kernel.org Sun Jun 26 00:39:03 2005
-Date: Sun, 26 Jun 2005 00:38:51 -0700 (PDT)
-To: stable@kernel.org
+From davem@davemloft.net Sun Jun 26 15:35:17 2005
+Date: Sun, 26 Jun 2005 15:35:08 -0700 (PDT)
+To: chrisw@osdl.org
+Cc: stable@kernel.org
From: "David S. Miller" <davem@davemloft.net>
Subject: [PATCH][NETLINK]: Fix two socket hashing bugs.
as they should and thus try to operate on a socket with a zero pid,
which is very bad.
+ However, it should not propagate -EBUSY. If two threads race
+ to autobind the socket, that is fine. This is consistent with the
+ autobind behavior in other protocols.
+
So bug #1 above, combined with this one, resulted in hangs
on netlink_sendmsg() calls to the rtnetlink socket. We'd try
to do the user sendmsg() with the socket's pid set to zero,
try to wake up the receive queue, we dive back into rtnetlink_rcv()
which tries to recursively take the rtnetlink semaphore.
-Thanks to Jakub Jelink for providing backtraces, and Herbert Xu for
-debugging patches to help track this down.
+Thanks to Jakub Jelink for providing backtraces. Also, thanks to
+Herbert Xu for supplying debugging patches to help track this down,
+and also finding a mistake in an earlier version of this fix.
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@osdl.org>
+---
-diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
---- a/net/netlink/af_netlink.c
-+++ b/net/netlink/af_netlink.c
-@@ -315,8 +315,8 @@ err:
+--- 1/net/netlink/af_netlink.c.~1~ 2005-06-26 15:30:20.000000000 -0700
++++ 2/net/netlink/af_netlink.c 2005-06-26 15:30:46.000000000 -0700
+@@ -315,8 +315,8 @@
static void netlink_remove(struct sock *sk)
{
netlink_table_grab();
if (nlk_sk(sk)->groups)
__sk_del_bind_node(sk);
netlink_table_ungrab();
-@@ -429,7 +429,7 @@ retry:
+@@ -429,7 +429,12 @@
err = netlink_insert(sk, pid);
if (err == -EADDRINUSE)
goto retry;
- return 0;
++
++ /* If 2 threads race to autobind, that is fine. */
++ if (err == -EBUSY)
++ err = 0;
++
+ return err;
}
static inline int netlink_capable(struct socket *sock, unsigned int flag)
-_______________________________________________
-stable mailing list
-stable@linux.kernel.org
-http://linux.kernel.org/mailman/listinfo/stable
-