concurrent-ruby is a modern concurrency tools for Ruby. Prior to 1.3.7, Concurrent::AtomicReference#update can enter a permanent busy retry loop when the current value is Float::NAN. The issue is caused by the interaction between AtomicReference#update, which retries until compare_and_set(old_value, new_value) succeeds; Numeric compare_and_set, which checks old == old_value before attempting the underlying atomic swap.; and Ruby NaN semantics, where Float::NAN == Float::NAN is always false. As a result, once an AtomicReference contains Float::NAN, calling #update repeatedly evaluates the caller's block and never returns. In services that store externally derived numeric values in an AtomicReference, this can cause CPU exhaustion or permanent request/job hangs. This vulnerability is fixed in 1.3.7.
{
"cna_assigner": "GitHub_M",
"cwe_ids": [
"CWE-835"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54904.json"
}{
"extracted_events": [
{
"cpe": "cpe:2.3:a:rubyconcurrency:concurrent_ruby:*:*:*:*:*:ruby:*:*",
"range": [
{
"introduced": "0"
},
{
"fixed": "1.3.7"
}
],
"source": "CPE_RANGE"
},
{
"range": [
{
"fixed": "6e37e0644b83b182971dc540d2e4bee38df61386"
}
],
"source": "REFERENCES_COMMIT"
},
{
"original_tag": "v1.3.7",
"range": [
{
"fixed": "4c8fc28ab6bb9bd8258a4c0c2fa6d35ebe77b3cb"
}
],
"source": "REFERENCES_TAG"
}
]
}