]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commit
rxrpc: Fix service call disconnection
authorDavid Howells <dhowells@redhat.com>
Thu, 6 Feb 2020 13:55:01 +0000 (13:55 +0000)
committerPaolo Pisati <paolo.pisati@canonical.com>
Mon, 17 Feb 2020 11:07:10 +0000 (12:07 +0100)
commit85527d310961403a9dd4f10868c42891f5a8cdca
tree4914f3f1cf63fc0e3a3df2bdc95b4f46d5aae1fe
parent2cc80d5fe3bdb9bf822c26618480440199a5565c
rxrpc: Fix service call disconnection

BugLink: https://bugs.launchpad.net/bugs/1863588
[ Upstream commit b39a934ec72fa2b5a74123891f25273a38378b90 ]

The recent patch that substituted a flag on an rxrpc_call for the
connection pointer being NULL as an indication that a call was disconnected
puts the set_bit in the wrong place for service calls.  This is only a
problem if a call is implicitly terminated by a new call coming in on the
same connection channel instead of a terminating ACK packet.

In such a case, rxrpc_input_implicit_end_call() calls
__rxrpc_disconnect_call(), which is now (incorrectly) setting the
disconnection bit, meaning that when rxrpc_release_call() is later called,
it doesn't call rxrpc_disconnect_call() and so the call isn't removed from
the peer's error distribution list and the list gets corrupted.

KASAN finds the issue as an access after release on a call, but the
position at which it occurs is confusing as it appears to be related to a
different call (the call site is where the latter call is being removed
from the error distribution list and either the next or pprev pointer
points to a previously released call).

Fix this by moving the setting of the flag from __rxrpc_disconnect_call()
to rxrpc_disconnect_call() in the same place that the connection pointer
was being cleared.

Fixes: 5273a191dca6 ("rxrpc: Fix NULL pointer deref due to call->conn being cleared on disconnect")
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
net/rxrpc/conn_object.c