<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 30 Sep 2026 08:26:56 +0000</lastBuildDate>
    <item>
      <title>BREW-asciidoctor-CVE-2026-54905 — Concurrent Ruby: `ReentrantReadWriteLock` read-count overflow grants a write lock without exclusivity</title>
      <link>https://vulnerability.circl.lu/vuln/brew-asciidoctor-cve-2026-54905</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: asciidoctor&lt;/p&gt;
&lt;p&gt;### Summary
`Concurrent::ReentrantReadWriteLock` can incorrectly grant a write lock after one thread acquires the read lock 32,768 times.&lt;/p&gt;
&lt;p&gt;The lock stores a thread&amp;#39;s local read and write hold counts in one integer. The low 15 bits are used for the read hold count, and bit 15 is used as `WRITE_LOCK_HELD`. After 32,768 reentrant read acquisitions, the local read count crosses into the write-lock bit. `try_write_lock` then treats the thread as already holding a write lock and returns `true` without setting the global `RUNNING_WRITER` bit.&lt;/p&gt;
&lt;p&gt;This breaks the core mutual-exclusion guarantee: the caller is told it has a write lock, but other threads can still hold or acquire read locks at the same time.&lt;/p&gt;
&lt;p&gt;### Version
Software: concurrent-ruby
Version: 1.3.6
Commit: 7a1b78941c081106c20a9ca0144ac73a48d254ab&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The implementation uses a shared counter to track global readers/writers and a per-thread local counter to support reentrancy:&lt;/p&gt;
&lt;p&gt;```ruby
READER_BITS    = 15
WRITER_BITS    = 14&lt;/p&gt;
&lt;p&gt;WAITING_WRITER = 1 &amp;lt;&amp;lt; READER_BITS
RUNNING_WRITER = 1 &amp;lt;&amp;lt; (READER_BITS + WRITER_BITS)
MAX_READERS    = WAITING_WRITER - 1
MAX_WRITERS    = RUNNING_WRITER - MAX_READERS - 1&lt;/p&gt;
&lt;p&gt;WRITE_LOCK_HELD = 1 &amp;lt;&amp;lt; READER_BITS
READ_LOCK_MASK  = WRITE_LOCK_HELD - 1
WRITE_LOCK_MASK = MAX_WRITERS
```&lt;/p&gt;
&lt;p&gt;When a thread already holds a lock, `acquire_read_lock` increments `@HeldCount`:&lt;/p&gt;
&lt;p&gt;```ruby
if (held = @HeldCount.value) &amp;gt; 0
  if held &amp;amp; READ_LOCK_MASK == 0
    @Counter.update { |c| c + 1 }
  end
  @HeldCount.value = held…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: asciidoctor&lt;/p&gt;
&lt;p&gt;### Summary
`Concurrent::ReentrantReadWriteLock` can incorrectly grant a write lock after one thread acquires the read lock 32,768 times.&lt;/p&gt;
&lt;p&gt;The lock stores a thread&amp;#39;s local read and write hold counts in one integer. The low 15 bits are used for the read hold count, and bit 15 is used as `WRITE_LOCK_HELD`. After 32,768 reentrant read acquisitions, the local read count crosses into the write-lock bit. `try_write_lock` then treats the thread as already holding a write lock and returns `true` without setting the global `RUNNING_WRITER` bit.&lt;/p&gt;
&lt;p&gt;This breaks the core mutual-exclusion guarantee: the caller is told it has a write lock, but other threads can still hold or acquire read locks at the same time.&lt;/p&gt;
&lt;p&gt;### Version
Software: concurrent-ruby
Version: 1.3.6
Commit: 7a1b78941c081106c20a9ca0144ac73a48d254ab&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The implementation uses a shared counter to track global readers/writers and a per-thread local counter to support reentrancy:&lt;/p&gt;
&lt;p&gt;```ruby
READER_BITS    = 15
WRITER_BITS    = 14&lt;/p&gt;
&lt;p&gt;WAITING_WRITER = 1 &amp;lt;&amp;lt; READER_BITS
RUNNING_WRITER = 1 &amp;lt;&amp;lt; (READER_BITS + WRITER_BITS)
MAX_READERS    = WAITING_WRITER - 1
MAX_WRITERS    = RUNNING_WRITER - MAX_READERS - 1&lt;/p&gt;
&lt;p&gt;WRITE_LOCK_HELD = 1 &amp;lt;&amp;lt; READER_BITS
READ_LOCK_MASK  = WRITE_LOCK_HELD - 1
WRITE_LOCK_MASK = MAX_WRITERS
```&lt;/p&gt;
&lt;p&gt;When a thread already holds a lock, `acquire_read_lock` increments `@HeldCount`:&lt;/p&gt;
&lt;p&gt;```ruby
if (held = @HeldCount.value) &amp;gt; 0
  if held &amp;amp; READ_LOCK_MASK == 0
    @Counter.update { |c| c + 1 }
  end
  @HeldCount.value = held…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/brew-asciidoctor-cve-2026-54905</guid>
    </item>
    <item>
      <title>Withdrawn: CLEANSTART-2026-DE16221 — Security fixes for CVE-2026-54171, CVE-2026-54297, CVE-2026-54522, CVE-2026-54904, CVE-2026-54905, CVE-2026-54906, ghsa…</title>
      <link>https://vulnerability.circl.lu/vuln/cleanstart-2026-de16221</link>
      <description>&lt;p&gt;&lt;strong&gt;Withdrawn by the publisher.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; CleanStart: ruby-fluentd-1.18&lt;/p&gt;
&lt;p&gt;Multiple security vulnerabilities affect the ruby-fluentd-1.18 package. These issues are resolved in later releases. See references for individual vulnerability details.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Withdrawn by the publisher.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; CleanStart: ruby-fluentd-1.18&lt;/p&gt;
&lt;p&gt;Multiple security vulnerabilities affect the ruby-fluentd-1.18 package. These issues are resolved in later releases. See references for individual vulnerability details.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cleanstart-2026-de16221</guid>
    </item>
    <item>
      <title>CVE-2026-54905 — concurrent-ruby:  `ReentrantReadWriteLock` read-count overflow grants a write lock without exclusivity</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-54905</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; ruby-concurrency concurrent-ruby&lt;/p&gt;
&lt;p&gt;concurrent-ruby is a modern concurrency tools for Ruby. Prior to 1.3.7, Concurrent::ReentrantReadWriteLock can incorrectly grant a write lock after one thread acquires the read lock 32,768 times. The lock stores a thread&amp;#39;s local read and write hold counts in one integer. The low 15 bits are used for the read hold count, and bit 15 is used as WRITE_LOCK_HELD. After 32,768 reentrant read acquisitions, the local read count crosses into the write-lock bit. try_write_lock then treats the thread as already holding a write lock and returns true without setting the global RUNNING_WRITER bit. This breaks the core mutual-exclusion guarantee: the caller is told it has a write lock, but other threads can still hold or acquire read locks at the same time. This vulnerability is fixed in 1.3.7.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; ruby-concurrency concurrent-ruby&lt;/p&gt;
&lt;p&gt;concurrent-ruby is a modern concurrency tools for Ruby. Prior to 1.3.7, Concurrent::ReentrantReadWriteLock can incorrectly grant a write lock after one thread acquires the read lock 32,768 times. The lock stores a thread&amp;#39;s local read and write hold counts in one integer. The low 15 bits are used for the read hold count, and bit 15 is used as WRITE_LOCK_HELD. After 32,768 reentrant read acquisitions, the local read count crosses into the write-lock bit. try_write_lock then treats the thread as already holding a write lock and returns true without setting the global RUNNING_WRITER bit. This breaks the core mutual-exclusion guarantee: the caller is told it has a write lock, but other threads can still hold or acquire read locks at the same time. This vulnerability is fixed in 1.3.7.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-54905</guid>
    </item>
  </channel>
</rss>
