Files
kernel_google_wahoo/include/net
Sean Tranchetti 2506cfc94d genetlink: remove genl_bind
[ Upstream commit 1e82a62fec613844da9e558f3493540a5b7a7b67 ]

A potential deadlock can occur during registering or unregistering a
new generic netlink family between the main nl_table_lock and the
cb_lock where each thread wants the lock held by the other, as
demonstrated below.

1) Thread 1 is performing a netlink_bind() operation on a socket. As part
   of this call, it will call netlink_lock_table(), incrementing the
   nl_table_users count to 1.
2) Thread 2 is registering (or unregistering) a genl_family via the
   genl_(un)register_family() API. The cb_lock semaphore will be taken for
   writing.
3) Thread 1 will call genl_bind() as part of the bind operation to handle
   subscribing to GENL multicast groups at the request of the user. It will
   attempt to take the cb_lock semaphore for reading, but it will fail and
   be scheduled away, waiting for Thread 2 to finish the write.
4) Thread 2 will call netlink_table_grab() during the (un)registration
   call. However, as Thread 1 has incremented nl_table_users, it will not
   be able to proceed, and both threads will be stuck waiting for the
   other.

genl_bind() is a noop, unless a genl_family implements the mcast_bind()
function to handle setting up family-specific multicast operations. Since
no one in-tree uses this functionality as Cong pointed out, simply removing
the genl_bind() function will remove the possibility for deadlock, as there
is no attempt by Thread 1 above to take the cb_lock semaphore.

Fixes: c380d9a7af ("genetlink: pass multicast bind/unbind to families")
Suggested-by: Cong Wang <xiyou.wangcong@gmail.com>
Acked-by: Johannes Berg <johannes.berg@intel.com>
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-07-22 09:10:03 +02:00
..
2018-09-29 03:08:51 -07:00
2019-03-23 08:44:34 +01:00
2014-09-18 10:54:36 +02:00
2019-02-23 09:05:14 +01:00
2015-03-06 21:50:02 -05:00
2015-09-17 17:18:37 -07:00
2018-02-25 11:03:34 +01:00
2014-09-30 01:02:26 -04:00
2020-07-22 09:10:03 +02:00
2019-03-23 08:44:23 +01:00
2019-11-25 15:53:57 +01:00
2015-10-08 04:27:03 -07:00
2015-10-23 06:26:42 -07:00
2018-05-16 10:06:50 +02:00
2018-02-25 11:03:40 +01:00
2020-05-10 10:26:22 +02:00
2015-03-12 22:58:12 -04:00
2020-05-02 17:20:33 +02:00
2015-10-26 22:24:22 -07:00
2020-05-10 10:26:23 +02:00