Skip to content

gh-160520: Apply asyncio ssl_shutdown_timeout after peer EOF - #160521

Draft
gpshead wants to merge 2 commits into
python:mainfrom
gpshead:scanfix-sslproto-81hubbj7
Draft

gpshead wants to merge 2 commits into
python:mainfrom
gpshead:scanfix-sslproto-81hubbj7

Conversation

@gpshead

@gpshead gpshead commented Oct 23, 2026 •

Copy link
Copy Markdown
Member

SSLProtocol._on_shutdown_complete() cancelled the shutdown timer, or had none if the peer sent EOF before close(), and then called the non-aborting close() of the underlying transport, so a peer that half-closed and stopped reading kept the connection open with no time limit. The timer is now kept (or started) on the success path and cancelled by connection_lost() as before, so _check_shutdown_timeout() aborts the transport if its write buffer has not drained in time.

One behaviour change to be aware of: a peer that half-closes and then needs longer than ssl_shutdown_timeout to read the data still queued for it is now cut off with TimeoutError, as a peer that does not half-close already is.

Fixes #160520

ANT-2026-81HUBBJ7

Keep the SSL shutdown timer running until connection_lost(), and start
it when the peer shuts down first, so that a peer which sends EOF but
does not read cannot keep a closed transport open indefinitely.
@gpshead gpshead added needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes labels Oct 23, 2026
@gpshead gpshead self-assigned this Oct 23, 2026
@gpshead gpshead added needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes labels Oct 23, 2026
@gpshead
gpshead marked this pull request as ready for review October 23, 2026 22:03
@gpshead
gpshead requested a review from picnixz as a code owner October 23, 2026 22:03
@gpshead gpshead added the sprint label Oct 23, 2026
@github-project-automation github-project-automation Bot moved this to Todo in Sprint Oct 23, 2026
@gpshead
gpshead marked this pull request as draft October 23, 2026 22:50
@gpshead

gpshead commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

leave as a draft while working out the windows testing issue

Write until the app protocol is told to pause writing before closing or
letting the peer send EOF, rather than assuming one SOCK_MAX_SIZE write
is enough to back up the transport.  That was not the case on the
Windows proactor event loop, where the connection closed cleanly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes sprint

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

asyncio SSL transport ignores ssl_shutdown_timeout after the peer sends EOF

1 participant