io: TextIOWrapper silently corrupts output when encoder is a no-op
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 75/100
Piste de recherche
Lis _io_TextIOWrapper_write_impl dans Modules/_io/textio.c, en particulier la vérification liée dans le rapport, et examine les tests TextIOWrapper à proximité concernant les types de retour de l’encodeur. Reproduis le cas de l’encodeur passthrough de l’issue, puis ajoute un test de régression et vérifie que l’entrée non ASCII déclenche le TypeError indiqué tandis que le chemin rapide ASCII fonctionne toujours.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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
- Langage dominant
- Python
- Étoiles
- 77.9k
- Forks
- 37.1k
- Merge moyen
- 17 h 43 min
- PR mergées (30 j)
- 675
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
OS-windows performance stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
OS-windows performance stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
build OS-unsupported OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 60/100
Les mainteneurs répondent en général sous 1 jour
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Peut-être pris @TheLouisMahdi l’a pris il y a 4 jours. Ouvertedocs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
python/cpython#161078 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/cpython
Issues similaires
-
docs size:S
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
strawberry-graphql/strawberry#4794 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
dataforgoodfr/cetolog#21 ·
-
security_citations_test fails against ecc 2026.11.6: SECURITY.md quotes ecc v2026.11.2's linesOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
btclib-org/btclib#2932 ·
Les mainteneurs répondent en général sous 1 jour