Skip to content

gh-159811: Raise OpenSSL errors in _hashlib.HASH after re-attaching the thread state - #159817

Merged
picnixz merged 1 commit into
python:mainfrom
picnixz:meta/crypto/c/hashlib/32/hash-gil-issue-159811
Oct 20, 2026
Merged

picnixz merged 1 commit into
python:mainfrom
picnixz:meta/crypto/c/hashlib/32/hash-gil-issue-159811

Conversation

@picnixz

@picnixz picnixz commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

_hashlib_HASH_hash() set an exception when EVP_DigestUpdate() failed, but it is called inside a GIL-released region by _hashlib.HASH.update() and by the _hashlib.HASH constructor when the data exceeds HASHLIB_GIL_MINSIZE bytes. Setting the exception with the thread state detached crashes the interpreter instead of raising a ValueError.

Only report the failure in _hashlib_HASH_hash() and set the exception in its callers once the thread state is re-attached. The OpenSSL error queue is per thread, so the exception message is unaffected.

The _hashlib.HMAC counterpart is handled in #159818 as it only affects 3.15 and later, whereas this one should be backported to 3.13 and 3.14 as well.

…aching the thread state

`_hashlib_HASH_hash()` set an exception when EVP_DigestUpdate() failed,
but it is called inside a GIL-released region by `_hashlib.HASH.update()`
and by the `_hashlib.HASH` constructor when the data exceeds
HASHLIB_GIL_MINSIZE bytes. Setting the exception with the thread state
detached crashed the interpreter instead of raising a ValueError.

Only report the failure in `_hashlib_HASH_hash()` and set the exception
in its callers once the thread state is re-attached. The OpenSSL error
queue is per thread, so the exception message is unaffected.
@picnixz
picnixz requested a review from gpshead as a code owner October 19, 2026 23:59
@picnixz picnixz added needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes sprint labels Oct 20, 2026
@github-project-automation github-project-automation Bot moved this to Todo in Sprint Oct 20, 2026
@picnixz picnixz self-assigned this Oct 20, 2026
@picnixz
picnixz merged commit 6fa2d64 into python:main Oct 20, 2026
64 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in Sprint Oct 20, 2026
@miss-islington-app

Copy link
Copy Markdown

Thanks @picnixz for the PR 🌮🎉.. I'm working now to backport this PR to: 3.14, 3.15.
🐍🍒⛏🤖 I'm not a witch! I'm not a witch!

@miss-islington-app

Copy link
Copy Markdown

Sorry, @picnixz, I could not cleanly backport this to 3.14 due to a conflict.

Please backport manually with cherry_picker, see the devguide for more information.

cherry_picker 6fa2d645ea57120d1cbf38b45fc8ee2b5019090b 3.14

@bedevere-app

bedevere-app Bot commented Oct 20, 2026

Copy link
Copy Markdown

GH-159927 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 bugs and security fixes label Oct 20, 2026
@bedevere-app

bedevere-app Bot commented Oct 20, 2026

Copy link
Copy Markdown

GH-159937 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Oct 20, 2026
@picnixz
picnixz deleted the meta/crypto/c/hashlib/32/hash-gil-issue-159811 branch October 20, 2026 18:09
picnixz added a commit that referenced this pull request Oct 20, 2026
…taching the thread state (GH-159817) (#159937)

When `EVP_DigestUpdate()` failed, `_hashlib_HASH_hash()` raised a Python
exception, however, `_hashlib.HASH.update()` and the `_hashlib.HASH`
constructor release the GIL before calling it when the data is larger
than `HASHLIB_GIL_MINSIZE` bytes.

`_hashlib_HASH_hash()` now only returns an error status and its callers
raise the exception once they have re-attached the thread state.

(cherry picked from commit 6fa2d64)
picnixz added a commit that referenced this pull request Oct 20, 2026
…taching the thread state (GH-159817) (#159927)

gh-159811: Raise OpenSSL errors in `_hashlib.HASH` after re-attaching the thread state (GH-159817)

When `EVP_DigestUpdate()` failed, `_hashlib_HASH_hash()` raised a Python
exception, however, `_hashlib.HASH.update()` and the `_hashlib.HASH`
constructor release the GIL before calling it when the data is larger
than `HASHLIB_GIL_MINSIZE` bytes.

`_hashlib_HASH_hash()` now only returns an error status and its callers
raise the exception once they have re-attached the thread state.

(cherry picked from commit 6fa2d64)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant