io: TextIOWrapper silently corrupts output when encoder is a no-op
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 75/100
Rechercherichtung
Lies _io_TextIOWrapper_write_impl in Modules/_io/textio.c, insbesondere die im Bericht verlinkte Prüfung, und sieh dir die Tests in der Nähe für TextIOWrapper-Rückgabetypen des Encoders an. Reproduziere den im Issue beschriebenen Fall mit einem Passthrough-Encoder, füge dann einen Regressionstest hinzu und überprüfe, dass Nicht-ASCII-Eingaben den angegebenen TypeError auslösen, während der ASCII-Fast-Path weiterhin funktioniert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Bug report
Summary
When an encoder returns the input str itself, TextIOWrapper.write treats it as ASCII and writes the str's internal storage to the file. For non-ASCII text the file is silently corrupted.
Expected: TypeError: encoder should return a bytes object, not 'str'.
Reproducer
We use a 44-character string that ends in an emoji, so CPython internally stores it as four bytes per character.
import codecs
class Enc(codecs.IncrementalEncoder):
def encode(self, text, final=False):
return text
info = codecs.CodecInfo(None, None, incrementalencoder=Enc,
incrementaldecoder=codecs.getincrementaldecoder("utf-8"),
name="passthrough")
codecs.register(lambda n: info if n == "passthrough" else None)
with open("out.txt", "w", encoding="passthrough") as f:
f.write("The quick brown fox jumps over the lazy dog🐍")
print(open("out.txt").read())
The quick b
Only the first 44 bytes (out of 44*4 = 176) were written to the file.
Root cause
Modules/_io/textio.c, in _io_TextIOWrapper_write_impl:
The exemption for b == text is meant for the ASCII fast path, which sets b = text only for ASCII text.
A Python encoder that returns its input also satisfies it, with any text.
Suggested fix
Tie the exemption to what the fast path relies on, that the text is ASCII:
if (!PyBytes_Check(b) && !(b == text && PyUnicode_IS_ASCII(text))) {
With this the reproducer raises the TypeError above.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
- Vorherrschende Sprache
- Python
- Sterne
- 77.9k
- Forks
- 37.1k
- Ø Merge
- 17 Std. 43 Min.
- Gemergte PRs (30 T.)
- 675
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus python/cpython
-
OS-windows performance stdlib type-feature
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
OS-windows performance stdlib type-feature
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
-
build OS-unsupported OS-windows type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 60/100
Maintainer antworten meist innerhalb von 1 Tag
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Evtl. vergeben @TheLouisMahdi hat das vor 4 Tagen übernommen. Offendocs
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 82/100
python/cpython#161078 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
OS-windows type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 1 Tag
Ähnliche Issues
-
docs size:S
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
strawberry-graphql/strawberry#4794 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
dataforgoodfr/cetolog#21 ·
-
security_citations_test fails against ecc 2026.11.6: SECURITY.md quotes ecc v2026.11.2's linesOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
btclib-org/btclib#2932 ·
Maintainer antworten meist innerhalb von 1 Tag