Bump multidict from 6.7.1 to 6.9.1
Bumps multidict from 6.7.1 to 6.9.1.
Release notes
Sourced from multidict's releases.
6.9.1
Bug fixes
Fixed the C extension reading freed memory on free-threaded builds when a list handed to :py:meth:
~multidict.MultiDict.update, :py:meth:~multidict.MultiDict.extend, :py:meth:~multidict.MultiDict.mergeor the :py:class:~multidict.MultiDictand :py:class:~multidict.CIMultiDictconstructors, a[key, value]item inside any iterable handed to them, or a list tested withinagainst :py:meth:~multidict.MultiDict.items, is changed by another thread; a call that catches the list shrinking under it now raises :py:exc:RuntimeError-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub: #1437.
Fixed a data race on the free-threaded build where a retired hash table's reader count used relaxed atomics, letting a lock-free
get()/getone()/__getitem__()read race a concurrent free of that table. The reader-exit decrement and the drain's free check now use release/acquire ordering instead -- by :user:asvetlov.Related issues and pull requests on GitHub: #1481.
Fixed a free-threaded build bug where two threads calling
update(),merge(), or__setitem__()on the same key at the same time could lose the key entirely instead of just racing on which value wins. A decref of the replaced value could transiently suspend the writer's critical section, letting a second writer for the same key observe the first writer's in-progress entry as absent and, once both settled, mistake it for a stale duplicate and delete it. Every such decref is now deferred until the writer has released its critical section, so the window can no longer open.setdefault()had an unrelated instance of the same blind spot (it could insert a duplicate rather than recognizing an in-flight key), fixed alongside it -- by :user:asvetlov.Related issues and pull requests on GitHub: #1483.
Fixed a free-threaded build bug where
getall()and theitems()/keys()/values()equality path could raiseKeyErroror report a present, never-deleted key as missing. A concurrentupdate()/extend()/__setitem__()call can have its critical section transiently suspended (a decref triggering a blocking allocator call) while an entry is marked as part of its own bookkeeping; a reader landing in that window used to treat the mark as "not found" instead of "still there, in flight" -- by :user:asvetlov.Related issues and pull requests on GitHub:
... (truncated)
Changelog
Sourced from multidict's changelog.
6.9.1
(2026-09-21)
Bug fixes
Fixed the C extension reading freed memory on free-threaded builds when a list handed to :py:meth:
~multidict.MultiDict.update, :py:meth:~multidict.MultiDict.extend, :py:meth:~multidict.MultiDict.mergeor the :py:class:~multidict.MultiDictand :py:class:~multidict.CIMultiDictconstructors, a[key, value]item inside any iterable handed to them, or a list tested withinagainst :py:meth:~multidict.MultiDict.items, is changed by another thread; a call that catches the list shrinking under it now raises :py:exc:RuntimeError-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub: :issue:
1437.Fixed a data race on the free-threaded build where a retired hash table's reader count used relaxed atomics, letting a lock-free
get()/getone()/__getitem__()read race a concurrent free of that table. The reader-exit decrement and the drain's free check now use release/acquire ordering instead -- by :user:asvetlov.Related issues and pull requests on GitHub: :issue:
1481.Fixed a free-threaded build bug where two threads calling
update(),merge(), or__setitem__()on the same key at the same time could lose the key entirely instead of just racing on which value wins. A decref of the replaced value could transiently suspend the writer's critical section, letting a second writer for the same key observe the first writer's in-progress entry as absent and, once both settled, mistake it for a stale duplicate and delete it. Every such decref is now deferred until the writer has released its critical section, so the window can no longer open.setdefault()had an unrelated instance of the same blind spot (it could insert a duplicate rather than recognizing an in-flight key), fixed alongside it -- by :user:asvetlov.Related issues and pull requests on GitHub: :issue:
1483.Fixed a free-threaded build bug where
getall()and theitems()/keys()/values()equality path could raiseKeyErroror report a present, never-deleted key as missing. A concurrentupdate()/extend()/__setitem__()call can have its critical section transiently suspended (a decref triggering a blocking allocator call) while an entry is marked as
... (truncated)
Commits
0a1770cRelease 6.9.1 (#1504)d220522Upload release assets one at a time to avoid the secondary rate limit (#1503)30cd596Stop a GIL-releasing del from segfaulting the standard C extension build ...d1c331aRecheck the reader gate after taking the retired list (#1502)b37f07cAllocate deferred decrefs in fixed-size blocks (#1501)563f667Run CodSpeed benchmarks on Python 3.14 and loop the smallest ones (#1498)157c87cCancel superseded CI runs on pull requests (#1500)d43adfeDrop -I from the ASan test command so PYTHONMALLOC takes effect (#1499)2a68472Stop items() iteration from reading a freed entry in CIMultiDict (#1496)cd528d6Rename GHSA-54p9-h82j-f925 changelog fragment to the merged commit (#1495)- Additional commits viewable in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the Security Alerts page.
Summary by cubic
Updates multidict from 6.7.1 to 6.9.1 in uv.lock, pulling in fixes for memory-safety and concurrency bugs in the C extension, especially on free-threaded builds.