CVE-2026-98072info

Summary

by MITRE • 09/25/2026

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

net/rds: use wq_has_sleeper() in release_in_xmit()

release_in_xmit() clears RDS_IN_XMIT with clear_bit_unlock() and then checks waitqueue_active() to decide whether anyone needs waking. clear_bit_unlock() is only a release operation: it orders the critical section before the bit clear, but does not order the subsequent plain load of the wait queue head after it. The waiter side does the mirror image - it adds itself to the wait queue and then tests the bit. That is the classic store-buffering pattern: the releasing CPU can read the wait queue as empty while the waiting CPU still reads the bit as set, so the sleeper is never woken.

The waiters are rds_conn_shutdown() and rds_tcp_reset_callbacks(), both in uninterruptible wait_event() with no timeout. A lost wake-up strands the shutdown worker on its single-threaded workqueue until some other sender releases the bit again - and on a connection that is being torn down precisely because it failed, there may never be another sender.

The barrier used to be there: release_in_xmit() did clear_bit() followed by smp_mb__after_atomic() until commit 1422f28826d2 ("rds: introduce acquire/release ordering in acquire/release_in_xmit()") folded both into clear_bit_unlock(), which strengthened the lock hand-off but silently dropped the full barrier the wake-up check depends on. The refill counterpart, release_refill() in net/rds/ib_recv.c, still carries its smp_mb__after_atomic() for exactly this reason.

Use wq_has_sleeper(), which is waitqueue_active() preceded by the required full barrier.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Analysis

by VulDB Data Team • 09/25/2026

The vulnerability resides within the Linux kernel's Reliable Datagram Sockets (RDS) networking subsystem, specifically in the net/rds module where memory management and connection state transitions are handled through atomic operations and wait queues. The core technical flaw is a lost wake-up condition caused by improper memory ordering between producer and consumer threads during the release of transmission buffers. In this context, the function release_in_xmit() is responsible for clearing the RDS_IN_XMIT bit to signal that a buffer is no longer being transmitted and potentially waking up waiting processes. However, the implementation uses clear_bit_unlock(), which provides only a release memory barrier ordering the critical section before the bit clear but fails to provide a full memory barrier after the operation. This omission means there is no guarantee that subsequent reads of the wait queue head will see updates made by other CPUs in a timely or consistent manner relative to the bit change.

The operational impact stems from the classic store-buffering pattern inherent in concurrent programming without proper synchronization primitives. When the releasing CPU clears the atomic flag, it may proceed to check if any threads are waiting on the associated wait queue before those waiting threads have fully published their presence by adding themselves to that queue. Conversely, a waiter thread adds itself to the wait queue and then checks the status of the RDS_IN_XMIT bit. Due to the lack of a full memory barrier preceding the wake-up check in release_in_xmit(), the releasing CPU can observe an empty wait queue even though waiting threads are actively present but not yet visible due to store buffering delays. Consequently, these sleeper threads remain blocked indefinitely because they were never signaled that their condition had been met.

This defect specifically affects rds_conn_shutdown() and rds_tcp_reset_callbacks(), which utilize uninterruptible sleep states with no timeout via wait_event(). When a lost wake-up occurs in these contexts, the shutdown worker becomes stranded on its single-threaded workqueue. Since this worker is responsible for tearing down connections that have failed or are being reset, the inability to proceed effectively halts the cleanup process. In scenarios where the connection failure prevents any other sender from releasing the bit again, the system may experience a permanent hang or resource leak, as there will be no subsequent trigger to wake up the stranded worker thread. This represents a significant reliability issue in high-load or unstable network conditions where rapid connection teardowns are frequent.

The root cause was introduced by commit 1422f28826d2, which refactored the locking mechanism to use acquire/release ordering semantics via clear_bit_unlock(). While this change improved lock hand-off efficiency and strengthened certain aspects of concurrency control, it inadvertently removed an explicit full memory barrier (smp_mb__after_atomic()) that was previously present in earlier versions. The counterpart function release_refill() retains its own smp_mb__after_atomic() call precisely to prevent similar issues in receive buffer management, highlighting the asymmetry that led to this oversight. To resolve this, the fix replaces the plain waitqueue_active check with wq_has_sleeper(), a helper function designed specifically for this purpose. This function ensures that a full memory barrier is executed before checking if any sleepers are present on the queue, thereby guaranteeing visibility of waiter additions and preventing lost wake-ups.

From a classification perspective, this vulnerability aligns with CWE-362: Concurrent Execution using Shared Resource with Improper Synchronization (Race Condition). The failure to properly synchronize access to shared state between threads leads to a race condition where one thread's actions are not visible to another in the expected order. In terms of adversarial tactics, while primarily causing denial-of-service through resource exhaustion or system hang rather than direct exploitation for privilege escalation, it relates to ATT&CK technique T1499: Endpoint Denial of Service, as an attacker could potentially trigger repeated connection failures to induce these hangs and degrade service availability. Mitigation strategies involve applying the kernel patch that updates net/rds/rdma.c to use wq_has_sleeper() in release_in_xmit(). System administrators should ensure their kernels are updated to versions containing this fix. Additionally, monitoring for hung tasks or stalled workqueues during network instability can help identify instances where this race condition has manifested before a full patch is applied.

Disclosure

09/25/2026

Moderation

in review

EPSS

0.00000

KEV

no

Activities

very low

Sources

Might our Artificial Intelligence support you?

Check our Alexa App!