Skip to content

Fixed SocketStream close race on asyncio - #1255

Open
subotac wants to merge 1 commit into
agronholm:masterfrom
subotac:fix/socket-stream-close-race
Open

Fixed SocketStream close race on asyncio#1255
subotac wants to merge 1 commit into
agronholm:masterfrom
subotac:fix/socket-stream-close-race

Conversation

@subotac

@subotac subotac commented Jul 30, 2026

Copy link
Copy Markdown

NOTE Erasing or replacing the contents of this template will result in your pull
request being summarily closed without consideration!

Changes

Fixes #1250.

On the asyncio backend, SocketStream.aclose() closes the transport, yields once, and then aborts it. If the write buffer drains during that checkpoint, connection_lost() may finalize the
transport before abort() runs, causing asyncio to access a transport loop that has already been cleared.

Track whether StreamProtocol.connection_lost() has run and skip the redundant abort in that case. Add a deterministic regression test covering this interleaving.

Checklist

If this is a user-facing code change, like a bugfix or a new feature, please ensure that
you've fulfilled the following conditions (where applicable):

  • You've added tests (in tests/) which would fail without your patch
  • You've updated the documentation (in docs/), in case of behavior changes or new
    features
    • Not applicable: this fixes an internal cleanup race without changing the documented API.
  • You've added a new changelog entry (in docs/versionhistory.rst).

If this is a trivial change, like a typo fix or a code reformatting, then you can ignore
these instructions.

Updating the changelog

If there are no entries after the last release, use **UNRELEASED** as the version.
If, say, your patch fixes issue #123, the entry should look like this:

If there's no issue linked, just link to your pull request instead by updating the
changelog after you've created the PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant