Skip to content

gh-161518: Reject a non-bytes encoder result unless it is the ASCII fast path - #161531

Open
harjothkhara wants to merge 1 commit into
python:mainfrom
harjothkhara:gh-161518-textio-encoder
Open

harjothkhara wants to merge 1 commit into
python:mainfrom
harjothkhara:gh-161518-textio-encoder

Conversation

@harjothkhara

Copy link
Copy Markdown
Contributor

TextIOWrapper.write() skips its "encoder should return a bytes object" check when the encoder returns the very same str it was given. That exemption is only valid for the internal ASCII fast path. A custom encoder that returns its non-ASCII input therefore had the str's internal storage written as bytes: a release build silently writes the wrong bytes, and a debug build aborts on an assertion in _textiowrapper_writeflush.

The check now accepts the same-object result only for ASCII text, so this case raises TypeError like any other encoder that does not return bytes. An encoder that returns the same ASCII str is still accepted, as before.

Added test_encoder_returns_str. It fails on the unfixed code (assertion on a debug build, no error on a release build) and passes with the change. test_io and test_codecs pass on a debug build.

I used AI assistance for this and have reviewed the change.

…SCII fast path

TextIOWrapper.write() accepted any encoder result that was the same
object as its input. That is only safe for ASCII text, so a custom
encoder returning a non-ASCII str wrote corrupt data.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
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.

1 participant