netlink: Fix autobind race condition that leads to zero port ID
The commitc0bb07df7d
("netlink: Reset portid after netlink_insert failure") introduced a race condition where if two threads try to autobind the same socket one of them may end up with a zero port ID. This led to kernel deadlocks that were observed by multiple people. This patch reverts that commit and instead fixes it by introducing a separte rhash_portid variable so that the real portid is only set after the socket has been successfully hashed. Fixes:c0bb07df7d
("netlink: Reset portid after netlink_insert failure") Reported-by: Tejun Heo <tj@kernel.org> Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
3ea79249e8
commit
1f770c0a09
@@ -25,6 +25,7 @@ struct netlink_ring {
|
||||
struct netlink_sock {
|
||||
/* struct sock has to be the first member of netlink_sock */
|
||||
struct sock sk;
|
||||
u32 rhash_portid;
|
||||
u32 portid;
|
||||
u32 dst_portid;
|
||||
u32 dst_group;
|
||||
|
Reference in New Issue
Block a user