Skip to content

gh-156365: Fix socket leak and stalled accept in the asyncio proactor server - #156366

Open
tonghuaroot wants to merge 1 commit into
python:mainfrom
tonghuaroot:gh-156365-proactor-accept-transport-error
Open

tonghuaroot wants to merge 1 commit into
python:mainfrom
tonghuaroot:gh-156365-proactor-accept-transport-error

Conversation

@tonghuaroot

@tonghuaroot tonghuaroot commented Aug 25, 2026 •

Copy link
Copy Markdown
Contributor

BaseProactorEventLoop._start_serving() ran protocol_factory() and transport creation in the accept callback guarded only by except OSError / except CancelledError. A per-connection failure therefore leaked the accepted socket and either stopped the accept loop (non-OSError) or closed the listening socket (OSError).

Wrap the per-connection setup so the accepted socket is closed and the error is reported to the loop exception handler, while accept-stage errors keep their existing handling. This is the proactor counterpart of gh-155934 (selector) and gh-153133 (create_connection).

The added regression tests fail without the fix and pass with it; the full test_asyncio suite passes.

@OsmnvAslan OsmnvAslan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ran this locally: it merges cleanly into current main, test_asyncio passes, and both new tests fail without the fix. It matches the selector change from gh-155934, so LGTM.

One small thing: the new context = {...} inside loop() shadows the context parameter of _start_serving(). It's unused in the proactor path right now, so nothing breaks, but renaming it (e.g. exc_context) would avoid a surprise if context=context is ever passed to the transport here like in the selector version.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants