You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Black writes a cache file, the name of which is computed from various formatting options. The value of the --python-cell-magics option was placed in the filename without sanitization, which allowed an attacker who controls the value of this argument to write cache files to arbitrary file system locations.
Patches
Fixed in Black 26.3.1.
Workarounds
Do not allow untrusted user input into the value of the --python-cell-magics option.
Prevent Jupyter notebook magic masking collisions from corrupting cells by using
exact-length placeholders for short magics and aborting if a placeholder can no longer
be unmasked safely (#5038)
Configuration
Always hash cache filename components derived from --python-cell-magics so custom
magic names cannot affect cache paths (#5038)
Blackd
Disable browser-originated requests by default, add configurable origin allowlisting
and request body limits, and bound executor submissions to improve backpressure
(#5039)
Don't double-decode input, causing non-UTF-8 files to be corrupted (#4964)
Fix crash on standalone comment in lambda default arguments (#4993)
Preserve parentheses when # type: ignore comments would be merged with other
comments on the same line, preventing AST equivalence failures (#4888)
Preview style
Fix bug where if guards in case blocks were incorrectly split when the pattern had
a trailing comma (#4884)
Fix string_processing crashing on unassigned long string literals with trailing
commas (one-item tuples) (#4929)
Simplify implementation of the power operator "hugging" logic (#4918)
Packaging
Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
frozen environments (#4930)
Performance
Introduce winloop for windows as an alternative to uvloop (#4996)
Remove deprecated function uvloop.install() in favor of uvloop.new_event_loop()
(#4996)
Rename maybe_install_uvloop function to maybe_use_uvloop to simplify loop
installation and creation of either a uvloop/winloop eventloop or default eventloop
(#4996)
Output
Emit a clear warning when the target Python version is newer than the running Python
version, since AST safety checks cannot parse newer syntax. Also replace the
misleading "INTERNAL ERROR" message with an actionable error explaining the version
mismatch (#4983)
Blackd
Introduce winloop to be used when windows in use which enables blackd to run faster on
windows when winloop is installed. (#4996)
Harden parsing of black requirements in the GitHub Action when use_pyproject is
enabled so that only version specifiers are accepted and direct references such as black @​ https://... are rejected. Users should upgrade to the latest version of the
action as soon as possible. This update is received automatically when using psf/black@stable, and is independent of the version of Black installed by the
action. (#5031)
Documentation
Expand preview style documentation with detailed examples for wrap_comprehension_in, simplify_power_operator_hugging, and wrap_long_dict_values_in_parens features
(#4987)
Add detailed documentation for formatting Jupyter Notebooks (#5009)
Introduces the 2026 stable style (#4892), stabilizing the following changes:
always_one_newline_after_import: Always force one blank line after import
statements, except when the line after the import is a comment or an import statement
(#4489)
fix_fmt_skip_in_one_liners: Fix # fmt: skip behavior on one-liner declarations,
such as def foo(): return "mock" # fmt: skip, where previously the declaration would
have been incorrectly collapsed (#4800)
fix_module_docstring_detection: Fix module docstrings being treated as normal
strings if preceded by comments (#4764)
fix_type_expansion_split: Fix type expansions split in generic functions (#4777)
multiline_string_handling: Make expressions involving multiline strings more compact
(#1879)
normalize_cr_newlines: Add \r style newlines to the potential newlines to
normalize file newlines both from and to (#4710)
remove_parens_around_except_types: Remove parentheses around multiple exception
types in except and except* without as (#4720)
remove_parens_from_assignment_lhs: Remove unnecessary parentheses from the left-hand
side of assignments while preserving magic trailing commas and intentional multiline
formatting (#4865)
standardize_type_comments: Format type comments which have zero or more spaces
between # and type: or between type: and value to # type: (value) (#4645)
The following change was not in any previous stable release:
Regenerated the _width_table.py and added tests for the Khmer language (#4253)
This release alo bumps pathspec to v1 and fixes inconsistencies with Git's .gitignore logic (#4958). Now, files will be ignored if a pattern matches them, even
if the parent directory is directly unignored. For example, Black would previously
format exclude/not_this/foo.py with this .gitignore:
exclude/
!exclude/not_this/
Now, exclude/not_this/foo.py will remain ignored. To ensure exclude/not_this/ and
all of it's children are included in formatting (and in Git), use this .gitignore:
*/exclude/*
!*/exclude/not_this/
This new behavior matches Git. The leading */ are only necessary if you wish to ignore
matching subdirectories (like the previous behavior did), and not just matching root
directories.
Output
Explicitly shutdown the multiprocessing manager when run in diff mode too (#4952)
Integrations
Upgraded PyPI upload workflow to use Trusted Publishing (#4611)
Black no longer supports running with Python 3.9 (#4842)
Stable style
Fix bug where comments preceding # fmt: off/# fmt: on blocks were incorrectly
removed, particularly affecting Jupytext's # %% [markdown] comments (#4845)
Fix crash when multiple # fmt: skip comments are used in a multi-part if-clause, on
string literals, or on dictionary entries with long lines (#4872)
Fix possible crash when fmt: directives aren't on the top level (#4856)
Preview style
Fix fmt: skip skipping the line after instead of the line it's on (#4855)
Remove unnecessary parentheses from the left-hand side of assignments while preserving
magic trailing commas and intentional multiline formatting (#4865)
Fix fix_fmt_skip_in_one_liners crashing on with statements (#4853)
Fix fix_fmt_skip_in_one_liners crashing on annotated parameters (#4854)
Fix new lines being added after imports with # fmt: skip on them (#4894)
Packaging
Releases now include arm64 Windows binaries and wheels (#4814)
Integrations
Add output-file input to GitHub Action psf/black to write formatter output to a
file for artifact capture and log cleanliness (#4824)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Labels
None yet
0 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
25.1.0→26.3.1Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Black: Arbitrary file writes from unsanitized user input in cache file name
CVE-2026-32274 / GHSA-3936-cmfr-pm3m
More information
Details
Impact
Black writes a cache file, the name of which is computed from various formatting options. The value of the
--python-cell-magicsoption was placed in the filename without sanitization, which allowed an attacker who controls the value of this argument to write cache files to arbitrary file system locations.Patches
Fixed in Black 26.3.1.
Workarounds
Do not allow untrusted user input into the value of the
--python-cell-magicsoption.Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
psf/black (black)
v26.3.1Compare Source
Stable style
exact-length placeholders for short magics and aborting if a placeholder can no longer
be unmasked safely (#5038)
Configuration
--python-cell-magicsso custommagic names cannot affect cache paths (#5038)
Blackd
and request body limits, and bound executor submissions to improve backpressure
(#5039)
v26.3.0Compare Source
Stable style
# type: ignorecomments would be merged with othercomments on the same line, preventing AST equivalence failures (#4888)
Preview style
ifguards incaseblocks were incorrectly split when the pattern hada trailing comma (#4884)
string_processingcrashing on unassigned long string literals with trailingcommas (one-item tuples) (#4929)
Packaging
frozen environments (#4930)
Performance
uvloop.install()in favor ofuvloop.new_event_loop()(#4996)
maybe_install_uvloopfunction tomaybe_use_uvloopto simplify loopinstallation and creation of either a uvloop/winloop eventloop or default eventloop
(#4996)
Output
version, since AST safety checks cannot parse newer syntax. Also replace the
misleading "INTERNAL ERROR" message with an actionable error explaining the version
mismatch (#4983)
Blackd
windows when winloop is installed. (#4996)
Integrations
blackrequirements in the GitHub Action whenuse_pyprojectisenabled so that only version specifiers are accepted and direct references such as
black @​ https://...are rejected. Users should upgrade to the latest version of theaction as soon as possible. This update is received automatically when using
psf/black@stable, and is independent of the version of Black installed by theaction. (#5031)
Documentation
wrap_comprehension_in,simplify_power_operator_hugging, andwrap_long_dict_values_in_parensfeatures(#4987)
v26.1.0Compare Source
Highlights
Introduces the 2026 stable style (#4892), stabilizing the following changes:
always_one_newline_after_import: Always force one blank line after importstatements, except when the line after the import is a comment or an import statement
(#4489)
fix_fmt_skip_in_one_liners: Fix# fmt: skipbehavior on one-liner declarations,such as
def foo(): return "mock" # fmt: skip, where previously the declaration wouldhave been incorrectly collapsed (#4800)
fix_module_docstring_detection: Fix module docstrings being treated as normalstrings if preceded by comments (#4764)
fix_type_expansion_split: Fix type expansions split in generic functions (#4777)multiline_string_handling: Make expressions involving multiline strings more compact(#1879)
normalize_cr_newlines: Add\rstyle newlines to the potential newlines tonormalize file newlines both from and to (#4710)
remove_parens_around_except_types: Remove parentheses around multiple exceptiontypes in
exceptandexcept*withoutas(#4720)remove_parens_from_assignment_lhs: Remove unnecessary parentheses from the left-handside of assignments while preserving magic trailing commas and intentional multiline
formatting (#4865)
standardize_type_comments: Format type comments which have zero or more spacesbetween
#andtype:or betweentype:and value to# type: (value)(#4645)The following change was not in any previous stable release:
_width_table.pyand added tests for the Khmer language (#4253)This release alo bumps
pathspecto v1 and fixes inconsistencies with Git's.gitignorelogic (#4958). Now, files will be ignored if a pattern matches them, evenif the parent directory is directly unignored. For example, Black would previously
format
exclude/not_this/foo.pywith this.gitignore:Now,
exclude/not_this/foo.pywill remain ignored. To ensureexclude/not_this/andall of it's children are included in formatting (and in Git), use this
.gitignore:This new behavior matches Git. The leading
*/are only necessary if you wish to ignorematching subdirectories (like the previous behavior did), and not just matching root
directories.
Output
Integrations
v25.12.0Compare Source
Highlights
Stable style
# fmt: off/# fmt: onblocks were incorrectlyremoved, particularly affecting Jupytext's
# %% [markdown]comments (#4845)# fmt: skipcomments are used in a multi-part if-clause, onstring literals, or on dictionary entries with long lines (#4872)
fmt:directives aren't on the top level (#4856)Preview style
fmt: skipskipping the line after instead of the line it's on (#4855)magic trailing commas and intentional multiline formatting (#4865)
fix_fmt_skip_in_one_linerscrashing onwithstatements (#4853)fix_fmt_skip_in_one_linerscrashing on annotated parameters (#4854)# fmt: skipon them (#4894)Packaging
Integrations
output-fileinput to GitHub Actionpsf/blackto write formatter output to afile for artifact capture and log cleanliness (#4824)
v25.11.0Compare Source
Highlights
Stable style
# fmt: offand# fmt: onwere reformatted (#4811)being normalized (#4811)
Preview style
multiline_string_handlingfrom--unstableto--preview(#4760)comments (#4764)
# type: <value>(#4645)fix_fmt_skip_in_one_linerspreview feature to respect# fmt: skipfor compoundstatements with semicolon-separated bodies (#4800)
Configuration
no_cacheoption to control caching behavior. (#4803)Packaging
Output
(#4610)
Blackd
requests to blackd (#4774)
Integrations
psf/blackto support therequired-versionmajor-version-only"stability" format when using pyproject.toml (#4770)
v25.9.0Compare Source
Highlights
await/asyncas soft keywords/variable names(#4676)
Stable style
delstatement containing tuples (#4628)withstatements (#4630)
# fmt: skipfollowed by a comment at the end of file (#4635)asclause of awithstatement (#4634)withstatement (#4646)\followed by a\rfollowed by a comment (#4663)\\r\n(#4673)await ...(where...is a literalEllipsis) (#4676)(#4670)
Preview style
# fmt: skipwould stillbe formatted (#4552)
multiline_string_handlingwith ternaries and dictionaries (#4657)string_processingwould not split f-strings directly afterexpressions (#4680)
inclause of comprehensions across lines if necessary (#4699)exceptandexcept*withoutas. (#4720)\rstyle newlines to the potential newlines to normalize file newlines both fromand to (#4710)
Parser
parameter bounds and defaults. (#4602)
Performance
Integrations
psf/blackto read Black version from an additional section inpyproject.toml:
[project.dependency-groups](#4606)Documentation
Configuration
📅 Schedule: (UTC)
* 0-3 * * 1)🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.