diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2015-09-18 11:16:50 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-21 05:55:31 (GMT) |
commit | 1f770c0a09da855a2b51af6d19de97fb955eca85 (patch) | |
tree | eeb43c3ce6917390ce6e55b48990d2ba32aaf9cc /net/netlink/af_netlink.h | |
parent | 3ea79249e81e5ed051f2e6480cbde896d99046e8 (diff) | |
download | linux-1f770c0a09da855a2b51af6d19de97fb955eca85.tar.xz |
netlink: Fix autobind race condition that leads to zero port ID
The commit c0bb07df7d981e4091432754e30c9c720e2c0c78 ("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: c0bb07df7d98 ("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>
Diffstat (limited to 'net/netlink/af_netlink.h')
-rw-r--r-- | net/netlink/af_netlink.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index df9a060..80b2b75 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h @@ -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; |