linux/net/rxrpc
David Howells 3bcd6c7eaa rxrpc: Fix race between conn bundle lookup and bundle removal [ZDI-CAN-15975]
After rxrpc_unbundle_conn() has removed a connection from a bundle, it
checks to see if there are any conns with available channels and, if not,
removes and attempts to destroy the bundle.

Whilst it does check after grabbing client_bundles_lock that there are no
connections attached, this races with rxrpc_look_up_bundle() retrieving the
bundle, but not attaching a connection for the connection to be attached
later.

There is therefore a window in which the bundle can get destroyed before we
manage to attach a new connection to it.

Fix this by adding an "active" counter to struct rxrpc_bundle:

 (1) rxrpc_connect_call() obtains an active count by prepping/looking up a
     bundle and ditches it before returning.

 (2) If, during rxrpc_connect_call(), a connection is added to the bundle,
     this obtains an active count, which is held until the connection is
     discarded.

 (3) rxrpc_deactivate_bundle() is created to drop an active count on a
     bundle and destroy it when the active count reaches 0.  The active
     count is checked inside client_bundles_lock() to prevent a race with
     rxrpc_look_up_bundle().

 (4) rxrpc_unbundle_conn() then calls rxrpc_deactivate_bundle().

Fixes: 245500d853 ("rxrpc: Rewrite the client connection manager")
Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-15975
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: zdi-disclosures@trendmicro.com
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Signed-off-by: David S. Miller <davem@davemloft.net>
2022-11-18 12:05:44 +00:00
..
af_rxrpc.c rxrpc: Use refcount_t rather than atomic_t 2022-05-22 21:03:01 +01:00
ar-internal.h rxrpc: Fix race between conn bundle lookup and bundle removal [ZDI-CAN-15975] 2022-11-18 12:05:44 +00:00
call_accept.c rxrpc: Fix locking issue 2022-05-22 21:03:01 +01:00
call_event.c rxrpc: Fix calc of resend age 2022-09-01 11:44:12 +01:00
call_object.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-25 12:39:40 -07:00
conn_client.c rxrpc: Fix race between conn bundle lookup and bundle removal [ZDI-CAN-15975] 2022-11-18 12:05:44 +00:00
conn_event.c rxrpc: Merge prime_packet_security into init_connection_security 2020-11-23 18:09:30 +00:00
conn_object.c rxrpc, afs: Fix selection of abort codes 2022-05-22 21:03:02 +01:00
conn_service.c rxrpc: Use refcount_t rather than atomic_t 2022-05-22 21:03:01 +01:00
input.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2022-05-23 21:19:17 -07:00
insecure.c rxrpc: Ask the security class how much space to allow in a packet 2020-11-23 19:53:11 +00:00
Kconfig net: RxRPC: make dependent Kconfig symbols be shown indented 2021-08-18 10:12:11 +01:00
key.c rxrpc: Fix handling of an unsupported token type in rxrpc_read() 2021-01-13 10:38:00 -08:00
local_event.c rxrpc: Fix a typo 2021-06-02 14:01:55 -07:00
local_object.c rxrpc: Fix local destruction being repeated 2022-09-01 11:44:12 +01:00
Makefile rxrpc: Split the server key type (rxrpc_s) into its own file 2020-11-23 18:09:29 +00:00
misc.c rxrpc: Fix the excessive initial retransmission timeout 2020-05-11 16:42:28 +01:00
net_ns.c rxrpc: Fix locking issue 2022-05-22 21:03:01 +01:00
output.c rxrpc: Fix decision on when to generate an IDLE ACK 2022-05-22 21:30:53 +01:00
peer_event.c rxrpc: Fix ICMP/ICMP6 error handling 2022-09-01 11:42:12 +01:00
peer_object.c rxrpc: Use refcount_t rather than atomic_t 2022-05-22 21:03:01 +01:00
proc.c rxrpc: Fix locking issue 2022-05-22 21:03:01 +01:00
protocol.h net: delete extra space and tab in blank line 2022-07-25 19:38:31 -07:00
recvmsg.c rxrpc: Remove rxrpc_get_reply_time() which is no longer used 2022-09-01 11:44:13 +01:00
rtt.c rxrpc: Fix _usecs_to_jiffies() by using usecs_to_jiffies() 2021-09-24 14:18:34 +01:00
rxkad.c rxrpc: Fix an insufficiently large sglist in rxkad_verify_packet_2() 2022-09-01 11:44:12 +01:00
security.c rxrpc: Hand server key parsing off to the security class 2020-11-23 18:09:29 +00:00
sendmsg.c rxrpc: Fix locking in rxrpc's sendmsg 2022-08-25 12:39:40 -07:00
server_key.c rxrpc: fix some null-ptr-deref bugs in server_key.c 2022-03-31 15:21:31 +02:00
skbuff.c rxrpc: Use refcount_t rather than atomic_t 2022-05-22 21:03:01 +01:00
sysctl.c rxrpc: Fix listen() setting the bar too high for the prealloc rings 2022-05-22 21:30:53 +01:00
utils.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 36 2019-05-24 17:27:11 +02:00