email: UnboundLocalError parsing a Message-ID whose domain literal starts with whitespace

Ouverte
#161,966 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

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
35/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
python
Domaine
backend

Piste de recherche

Start in email._header_value_parser, at _get_ptext_to_endchars, and reproduce the issue with parse_message_id('<a@[ x]>'). Done means parsing returns a header with a defect instead of raising UnboundLocalError; the issue mentions linked PR gh-161967, so check its status before starting.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Bug report

email._header_value_parser.parse_message_id and parse_message_ids raise UnboundLocalError when the part after @ is a domain literal that starts with a space or tab, such as <a@[ x]>. Because of this, reading Message-ID, References or In-Reply-To from such a message with policy.default raises instead of returning a header with a defect. gh-134152 fixed the same error for an empty literal (<T@[), but a literal that begins with whitespace still reaches the same code.

import email
from email import policy
from email._header_value_parser import parse_message_id

parse_message_id('<a@[ x]>')

msg = email.message_from_string('Message-ID: <a@[ x]>\n\nbody\n', policy=policy.default)
msg['Message-ID']

Actual:

UnboundLocalError: cannot access local variable 'pos' where it is not associated with a value

Expected: no exception. The header should parse with a defect, the same way <a@[x ]> already does (it gives a MessageID with an ObsoleteHeaderDefect, "obsolete id-right in msg-id").

The cause is in _get_ptext_to_endchars: when value starts with whitespace, the first fragment from _wsp_splitter is empty, the for pos in ... loop never runs, and the else clause reads pos before it is assigned.

CPython versions tested on:

3.15, CPython main branch

Operating systems tested on:

Linux


Found while building a Lean 4 model of CPython (https://broyojo.com/python-formalization/). AI tools (Claude) helped investigate the findings and prepare this report. The examples were rerun on CPython 3.15.2 and main, and the report received technical review. Record: textlibs-email-msgid-no-fold-literal-space

Linked PRs
  • gh-161967
Langage dominant
Python
Étoiles
78.2k
Forks
36.6k
Merge moyen
19 h 57 min
PR mergées (30 j)
630

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de python/cpython

Toutes les issues de python/cpython

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.