CVE-2022-49450

rxrpc: Fix listen() setting the bar too high for the prealloc rings

Medium · published February 26, 2025

CVSS v3.1
5.5
EPSS
0%
Percentile
20.5
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

rxrpc: Fix listen() setting the bar too high for the prealloc rings

AF_RXRPC's listen() handler lets you set the backlog up to 32 (if you bump

up the sysctl), but whilst the preallocation circular buffers have 32 slots

in them, one of them has to be a dead slot because we're using CIRC_CNT().

This means that listen(rxrpc_sock, 32) will cause an oops when the socket

is closed because rxrpc_service_prealloc_one() allocated one too many calls

and rxrpc_discard_prealloc() won't then be able to get rid of them because

it'll think the ring is empty. rxrpc_release_calls_on_socket() then tries

to abort them, but oopses because call->peer isn't yet set.

Fix this by setting the maximum backlog to RXRPC_BACKLOG_MAX - 1 to match

the ring capacity.

BUG: kernel NULL pointer dereference, address: 0000000000000086

...

RIP: 0010:rxrpc_send_abort_packet+0x73/0x240 [rxrpc]

Call Trace:

<TASK>

? __wake_up_common_lock+0x7a/0x90

? rxrpc_notify_socket+0x8e/0x140 [rxrpc]

? rxrpc_abort_call+0x4c/0x60 [rxrpc]

rxrpc_release_calls_on_socket+0x107/0x1a0 [rxrpc]

rxrpc_release+0xc9/0x1c0 [rxrpc]

__sock_release+0x37/0xa0

sock_close+0x11/0x20

__fput+0x89/0x240

task_work_run+0x59/0x90

do_exit+0x319/0xaa0

The record
Technical detail
CVSS v3.1
5.5 · MEDIUM
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
CVSS v4.0
Not supplied
EPSS
0.00291 · 20.5th percentile
Published
2025-02-26T02:13Z
EPSS history
Timeline
  • 26 FEB 02:13Z
    rxrpc: Fix listen() setting the bar too high for the prealloc rings
    cvelistv5