Skip to content

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

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

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

Conversation

@picnixz

@picnixz picnixz commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

hashlib_openssl_HMAC_update_once() set an exception when the OpenSSL HMAC update function failed, but it was called inside a GIL-released region, with the object's mutex held, by _hashlib.HMAC.update() and _hashlib.hmac_new() when the data exceeds HASHLIB_GIL_MINSIZE bytes. Setting the exception with the thread state detached crashes the interpreter instead of raising an exception.

Remove that helper, call the OpenSSL HMAC update function directly in _hmac_update(), and set the exception once the thread state is re-attached and the mutex is released, as it was done before gh-134531. The OpenSSL error queue is per thread, so the exception type and message are unaffected.

This regression was introduced by gh-134531, so only 3.15 needs a backport. The _hashlib.HASH counterpart, which also affects 3.13 and 3.14, is handled in #159817.

…aching the thread state

`hashlib_openssl_HMAC_update_once()` set an exception when the OpenSSL
HMAC update function failed, but it was called inside a GIL-released
region, with the object's mutex held, by `_hashlib.HMAC.update()` and
`_hashlib.hmac_new()` when the data exceeds HASHLIB_GIL_MINSIZE bytes.
Setting the exception with the thread state detached crashed the
interpreter instead of raising an exception.

Remove that helper, call the OpenSSL HMAC update function directly in
`_hmac_update()`, and set the exception once the thread state is
re-attached and the mutex is released, as it was done before pythongh-134531.
The OpenSSL error queue is per thread, so the exception type and message
are unaffected.
@picnixz
picnixz force-pushed the meta/crypto/c/hashlib/32/hmac-gil-issue-159811 branch from de4951c to 060abbf Compare October 20, 2026 00:07
@picnixz picnixz added 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 b4b81e1 into python:main Oct 20, 2026
60 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.15.
🐍🍒⛏🤖

@bedevere-app

bedevere-app Bot commented Oct 20, 2026

Copy link
Copy Markdown

GH-159926 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
@picnixz
picnixz deleted the meta/crypto/c/hashlib/32/hmac-gil-issue-159811 branch October 20, 2026 18:10
picnixz added a commit that referenced this pull request Oct 20, 2026
…taching the thread state (GH-159818) (#159926)

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

`hashlib_openssl_HMAC_update_once()` set an exception when the OpenSSL
HMAC update function failed, but it was called inside a GIL-released
region and the object's mutex held by `_hashlib.HMAC.update()` and
`_hashlib.hmac_new()` when the data exceeds `HASHLIB_GIL_MINSIZE` bytes.

Instead, the HMAC update function is called directly in `_hmac_update()`,
and the exception is set once the thread state is re-attached and the mutex
is released (restores the behavior prior to gh-134531).

Since the OpenSSL error queue is per thread, the exception type and message
are unaffected.

(cherry picked from commit b4b81e1)

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