<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://db.gcve.eu/rss/recent/all/10</id>
  <title>Most recent entries from all</title>
  <updated>2026-10-22T01:55:04.379273+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@gcve.eu</email>
  </author>
  <link href="https://db.gcve.eu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent entries.</subtitle>
  <entry>
    <id>https://db.gcve.eu/vuln/ghsa-253c-mchw-3w2r</id>
    <title>GHSA-253c-mchw-3w2r — markdown-it linkify: true has two quadratic paths, so a few hundred KB of markdown blocks the event loop for tens of se…</title>
    <updated>2026-10-22T01:55:04.392633+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> npm: markdown-it</p>
<p>## Summary</p>
<p>Two independent quadratic paths in the `linkify: true` handling. Both are in markdown-it's own code rather than in linkify-it, which stays linear on both payloads.</p>
<p>`src/rules_core/linkify.ts` calls `arrayReplaceAt` once per linkified text token, and that rebuilds the whole `children` array each time. A paragraph of N soft-broken lines is one inline token with about 2N children, so you get N rebuilds over a 2N array. Schema-less emails are what reach it. A `http://` link gets consumed by the inline rule first and never arrives as a text token, so those stay linear.</p>
<p>`src/rules_inline/linkify.ts` runs `state.pending.match(SCHEME_RE)` at every `://` in the source. `state.pending` only gets truncated once a link is actually produced, so an unregistered scheme leaves it growing and every `://` rescans the lot.</p>
<p>## Proof of concept</p>
<p>Clean install of 15.0.0 from npm, `new MarkdownIt({ linkify: true }).render(payload)`, Node 24.</p>
<p>| N | 5,000 | 10,000 | 20,000 | 40,000 |
|---|---|---|---|---|
| `'a@b.co\n'.repeat(N)`, 34KB to 273KB | 1.1s | 4.7s | 19.6s | 89s |
| `'a://'.repeat(N)`, 20KB to 156KB | 0.25s | 0.76s | 3.1s | 15.0s |</p>
<p>Doubling the input roughly quadruples the time in both. With `linkify: false` the same inputs run in 25 to 131ms and stay flat.</p>
<p>Controls for the first one, all at N=20000: putting every email in a single text token (`'a@b.co '`) takes 0.59s, one email per paragraph (`'a@b.co\n\n'`) takes 0.64s, and soft-broken lines with nothing linkifiable tak…</p></div>
    </content>
    <link href="https://db.gcve.eu/vuln/ghsa-253c-mchw-3w2r"/>
  </entry>
</feed>
