CVE-2022-49149: rxrpc: Fix call timer start racing with call destruction
In the Linux kernel, the following vulnerability has been resolved:
rxrpc: Fix call timer start racing with call destruction
The rxrpccall struct has a timer used to handle various timed events relating to a call. This timer can get started from the packet input routines that are run in softirq mode with just the RCU read lock held. Unfortunately, because only the RCU read lock is held - and neither ref or other lock is taken - the call can start getting destroyed at the same time a packet comes in addressed to that call. This causes the timer - which was already stopped - to get restarted. Later, the timer dispatch code may then oops if the timer got deallocated first.
Fix this by trying to take a ref on the rxrpccall struct and, if successful, passing that ref along to the timer. If the timer was already running, the ref is discarded.
The timer completion routine can then pass the ref along to the call's work item when it queues it. If the timer or work item where already queued/running, the extra ref is discarded.
Affected Software
Event History
Frequently Asked Questions
What conditions are required for this issue to occur?
The race requires an incoming packet addressed to an RXRPC call while that call is being destroyed. Packet input runs in softirq context with only an RCU read lock, allowing a stopped call timer to be restarted concurrently with teardown.
What is the likely impact if the race is triggered?
The timer dispatch code may oops if the timer is restarted and later executes after its associated state has been deallocated. This can cause a kernel crash.
How does the fix prevent the race?
The fix attempts to acquire a reference to the rxrpc_call before starting its timer and transfers that reference through the timer and queued work item. References are discarded when the timer or work is already queued or running, preventing the call from being freed while those operations still use it.